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

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

[复制链接]

160

主题

385

回帖

7421

积分

管理员

积分
7421
金钱
2129
贡献
4747
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
: x8 n2 ^8 m! N/ F5 c6 P  V, q, O- ]- M5 M9 E! @+ F' A4 P
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
% u/ x/ b) A& Y- I6 ?! j' K
  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 (% o$ y" j4 O% k- f
  2.     @character_name NVARCHAR(40)! W! {: b  ]; j( E
  3. )5 ?( q6 \* _# }( p: t- ~# B
  4. RETURNS TINYINT7 m' M/ w* g; n% |, F
  5. AS
    # X) I. W; ^9 Z6 k, I0 w
  6. BEGIN' S+ U( a6 ~  m' S
  7.     DECLARE @result TINYINT = 0;$ Z% M* w' }/ Z/ P& S6 W
  8.     DECLARE @char NVARCHAR(1);0 e! _- u; b( t/ }0 ~
  9.     DECLARE @i INT = 1;4 y& c+ K8 p/ F
  10.    
    , v4 O: H5 D( }+ l; H9 j
  11.     -- 遍历每个字符,检查是否合法, w! T0 x1 h6 Z
  12.     WHILE @i <= LEN(@character_name)2 N4 q4 Q9 I) d
  13.     BEGIN
    ) C; i7 Z- N. y: j, G
  14.         SET @char = SUBSTRING(@character_name, @i, 1);% h4 T: r# c! H8 I
  15.         
    + b% \8 E/ X: q( q
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    " x$ M6 G; N1 J+ s1 c! L* q
  17.         IF NOT (
    3 b7 w, }! t1 k5 ?+ [, k5 B- L# ~
  18.             -- 中文字符范围 (基本多文种平面)
    , g* b8 s' o+ R
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR, e0 }5 {) q0 v0 Y, a/ R' E# e! X
  20.             -- 英文字母和数字
    * \; s; S+ I# Q# A% E
  21.             @char LIKE '[a-zA-Z0-9]' OR) k; y* Z6 S* A: L  \: I% H6 Y
  22.             -- 允许的特殊符号7 M7 B4 t5 o0 w( g* |" x
  23.             @char LIKE '[_ -]'! B" u" F) P8 y- ^
  24.         )
    2 Z3 J3 s3 _+ x( D
  25.         BEGIN
    ' e# ~$ G( p  {) G+ t8 N
  26.             SET @result = 1;
      s- f. B* R' j- M4 I
  27.             BREAK;
    . P5 g+ t' G. k
  28.         END
    4 `, |7 _8 ^) a
  29.         % k* \+ _8 I) w( n; o
  30.         SET @i = @i + 1;
    ( m, e+ @' m, I/ p% x
  31.     END;
    % |: e2 X( c& F( a: i8 i
  32.     - G3 c4 o5 M# I$ k8 x4 _
  33.     -- 检查是否在非法名称列表中. }+ g: ]" g* p8 p  X# O
  34.     IF EXISTS (
    & x" S! z/ E* D3 G  M+ u8 E
  35.         SELECT 1
    % @) m0 e+ q6 n) @5 q8 S0 V. `- V* n
  36.         FROM dbo.illegal_character_names : o8 k1 r6 |2 a; i2 k) q8 m
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    % S2 n3 d0 `' a: f" h) W% h
  38.     )
    ; r' }0 W5 G3 N% j
  39.         SET @result = 1;
    7 a3 P- h) v! X4 _- W8 q7 O  P# z
  40.     0 w0 o) S, b8 u. A6 K" h" t
  41.     RETURN @result;
    6 v4 o4 P' e5 }# [) B# s
  42. END</span>1 A8 ?* x3 V2 c9 V
复制代码
插入屏蔽的字符
3 w9 L! f7 f! a5 i. J2 w
  1. -- 插入非法名称列表(明确列名并使用N前缀)0 d4 n; t, H! S2 g9 O% T9 B
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');/ L2 n6 T2 o4 d- w/ R! l
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
      }! g! h8 N8 u- n- t7 o
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    7 D$ x. L; j+ K4 |' i% g
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');4 X8 [6 `6 F2 p: [, D
  6.   J5 K5 c1 m1 b
  7. -- 示例:查询包含敏感词的角色名) e* W8 ?  \- |- d# x
  8. SELECT * ( O/ _3 v' r9 d$ e: L" I$ E/ R
  9. FROM dbo.characters
    ' C2 q* d, d5 Q0 ^: O( C, E2 F
  10. WHERE EXISTS (4 Y2 h- l% }; W3 T# o
  11.     SELECT 1 3 e# v1 U1 f) d  O
  12.     FROM dbo.illegal_character_names
    ; E) p' m5 b. U6 M' t
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'& N" N4 b! V6 V4 M5 E, }) N
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据  `8 C( h  b" K) w1 ^
原始为:. A# Q/ F6 a3 B8 k
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    : ~/ O# l) r" m5 d* Z2 z. t

  2. ! p8 R8 L  \3 z
  3. IF @v_ret < 0 7 t+ z) ^) j1 t/ O
  4. BEGIN
    3 Y, w, m9 O( d; [
  5. SET @sp_rtn = @v_ret9 ~  s* p, _. }  b& r
  6. RETURN
    * t# J3 a( ^8 S# F
  7. END
复制代码
修改为:
% n6 {5 V& v& ^, e' w, i2 P
  1. IF (dbo.NameBlock(@character_name) = 1)
    & M4 d; ^. Y: U5 _, l( f" J- Q
  2. BEGIN
    9 i  `4 e: k) y8 i# D
  3. SET @sp_rtn = -12& ~  c5 A6 W; x
  4. RETURN
    + \7 K( s5 t4 b+ m; A
  5. END
复制代码
  C' {# c- a% C
& ]- z0 l! ?8 w7 E+ H2 q5 G3 B1 }
! L7 D* {- p0 v8 C  ^: G
/ T+ }8 R5 R/ G! y4 D+ @1 }
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-5-1 00:58 , Processed in 0.452036 second(s), 30 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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