找回密码
 立即注册
查看: 1487|回复: 0

[技术文章] SQL修改角色名字限制

[复制链接]

157

主题

361

回帖

6695

积分

管理员

积分
6695
金钱
1935
贡献
4242
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
3 R" I: d. K9 Q  f' c) x2 Z/ [- c0 G! `5 \3 o! f
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
  L2 z% \4 v: g* p0 c( Y
  1. <span style="color: rgb(28, 31, 35); font-family: Inter, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, &quot;SF Pro SC&quot;, &quot;SF Pro Display&quot;, &quot;SF Pro Icons&quot;, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; font-size: medium; white-space: pre; background-color: rgb(255, 255, 255);">CREATE FUNCTION dbo.check_valid_character_name (
    ' v1 t* D: d" x
  2.     @character_name NVARCHAR(40)$ F# X5 L4 u5 F4 p6 G
  3. )+ }0 r/ S$ c' l5 M, ~
  4. RETURNS TINYINT
    8 M# R/ C) ^- }' l5 f
  5. AS# Z9 i7 z0 ^0 C
  6. BEGIN
    & u0 k6 F. B# }- \
  7.     DECLARE @result TINYINT = 0;
    " ?) N: H9 O4 ~+ t
  8.     DECLARE @char NVARCHAR(1);
    + Q) \- s) c, q$ u4 a' @* C
  9.     DECLARE @i INT = 1;
    ; m: z4 V# P" x- t0 `- D. b
  10.    
    + s6 n; n7 d' w$ m# ^
  11.     -- 遍历每个字符,检查是否合法
    ' t7 W, Z( o! ]: E4 E
  12.     WHILE @i <= LEN(@character_name)
    ' @8 G2 T) I6 i) W1 l7 |- F) q9 I
  13.     BEGIN8 y5 y; `5 K4 ]- C
  14.         SET @char = SUBSTRING(@character_name, @i, 1);3 p# q- M. g* p
  15.         
    " C( R# u3 y, M# b- N+ J
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    ! D" }9 ]  b3 H1 o) @& H
  17.         IF NOT (
    8 `1 ^9 t" [. X- @
  18.             -- 中文字符范围 (基本多文种平面)+ ^4 E+ o! A7 H0 q# Y
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR( w3 `% S2 l7 x" @8 u7 J. e
  20.             -- 英文字母和数字
    ' O9 ]1 L  G; k$ s! W/ m
  21.             @char LIKE '[a-zA-Z0-9]' OR# N1 l7 E7 J; v% C) u
  22.             -- 允许的特殊符号& Z* e5 f; Z2 P0 P  r
  23.             @char LIKE '[_ -]'
    & ]# S, q/ g1 a: N. v3 x
  24.         )4 k: z0 E8 {; C- ]
  25.         BEGIN5 q& w& x8 \9 ]) P4 d
  26.             SET @result = 1;' k: w8 x$ c7 y1 Z+ B3 J6 B
  27.             BREAK;
    , A! L% r$ T. H" X
  28.         END
    & n' z7 Y  L' J; u
  29.         9 l* b9 Y4 ~$ |1 y% b. K4 J
  30.         SET @i = @i + 1;6 C2 M! [" k& G
  31.     END;* a  a2 g- l+ x) Q/ w
  32.     # _3 E4 i5 @7 w' u6 |
  33.     -- 检查是否在非法名称列表中0 P: F3 I$ U5 Y% {. h: j0 N
  34.     IF EXISTS (
    / U" s9 Q. D% o4 h) ]: A; ]
  35.         SELECT 1
    " L' F4 d- f, }9 B+ C2 ^
  36.         FROM dbo.illegal_character_names * f) Y5 v$ Z- t* O  d) E
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    * j# K7 S5 y* X- t. z0 d
  38.     )
    ) C7 ?  U6 O; f. V& Q& u
  39.         SET @result = 1;
    : y# ?0 {5 D& h
  40.     ) x8 B+ c/ N8 h
  41.     RETURN @result;5 Z( M7 T' ^8 a
  42. END</span>) E( K- n' Z7 Y. `
复制代码
插入屏蔽的字符
4 E2 R% O, s3 O( s, E; c7 b" A" B% [
  1. -- 插入非法名称列表(明确列名并使用N前缀)! z# m" r( t# y) }
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');9 k; c) z+ d5 G% V
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');( S5 X1 ?5 P; `& }' ?7 B2 I( D' x% f" @
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    + f2 ]( [- L% o0 }0 q  ]& C
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');" Z( t9 l4 v" K' B2 ?3 y/ L/ J

  6. 3 d. A: N. @& N  t0 G, P, j$ D
  7. -- 示例:查询包含敏感词的角色名
    4 \& E  g& G! Z) L5 N
  8. SELECT *   t& U# G$ F# C: Z7 E' r/ r
  9. FROM dbo.characters
    5 x1 t( I* q; N0 H8 ?$ _5 \
  10. WHERE EXISTS (3 V9 W1 N5 p9 A6 \# g/ b5 n
  11.     SELECT 1
    & h( S1 g9 p$ y( i5 p# o" j
  12.     FROM dbo.illegal_character_names
    3 M( v. T$ a- n# |2 n6 F) v
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'- i1 g' ]$ v, j" a0 x
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据; j* x: y( d( |: w
原始为:
2 w6 W# B# o  g! ?) l; q& Z
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    * Q2 C7 g: @- E4 T& c% P3 \
  2. 7 M) u- R3 V4 d
  3. IF @v_ret < 0
    0 u9 }( D1 Q9 [
  4. BEGIN( i- ?" q6 B5 w1 z; h) L
  5. SET @sp_rtn = @v_ret
    ' p/ p4 v' a; F- {0 A
  6. RETURN: c* u8 e( H" o' V
  7. END
复制代码
修改为:
+ m4 w! l" e- d" u
  1. IF (dbo.NameBlock(@character_name) = 1)  e$ T0 u; }# i
  2. BEGIN6 \/ I& g4 l+ ]
  3. SET @sp_rtn = -12; x5 M5 C9 H8 G- j4 _
  4. RETURN
    3 V) z) ?4 G9 U( p- D5 G0 O4 L
  5. END
复制代码
  E+ N, z) l' N2 o. Q. D

! F$ E: w6 ?8 A! D* a0 ^$ g" I
7 f- d5 y% p3 {" J
4 N. g2 K/ F$ M8 N3 D% {
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-2-8 14:48 , Processed in 0.050641 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表