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

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

[复制链接]

153

主题

333

回帖

5692

积分

管理员

积分
5692
金钱
1793
贡献
3413
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表- H( B9 ^' _' |$ {4 ~( C5 d
. |6 `7 c; z6 G" i
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数# ~( a# n# i( j! @+ I
  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 (- t% X5 D% f, T0 R0 o
  2.     @character_name NVARCHAR(40)
    * n+ A) E) `# i  \, ^
  3. )
    4 l1 w+ I6 k" ]( o6 V+ y; @
  4. RETURNS TINYINT
    9 X  K: A- j* F  p! ?8 G6 c& P  D% T
  5. AS
    . a9 D$ J9 d4 z0 G( Z- K9 \' U
  6. BEGIN
    % o% z" s6 q( C
  7.     DECLARE @result TINYINT = 0;
    2 C. g3 h+ ?8 u8 l5 t8 j
  8.     DECLARE @char NVARCHAR(1);0 i& L1 N7 z& S0 T4 C, e
  9.     DECLARE @i INT = 1;
    3 Q' J  k+ m) i& o: Z
  10.    
    - U2 D2 w2 Z; u4 R1 d3 j
  11.     -- 遍历每个字符,检查是否合法2 q. W9 ?6 n* t
  12.     WHILE @i <= LEN(@character_name), S5 ]5 Q  W5 v' W" a6 @  X5 @6 Y
  13.     BEGIN
    + f7 k: Y* o' ]2 C3 w9 r# B3 k
  14.         SET @char = SUBSTRING(@character_name, @i, 1);8 Y9 @3 ^! w( w
  15.         , S9 a( ^; D% P- [) n% Y7 f9 Z
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    0 ^0 [3 }6 f' u  s! |
  17.         IF NOT (
    8 o$ G  y* o7 D0 ~! r8 g: P) ~
  18.             -- 中文字符范围 (基本多文种平面)  t# O0 Y2 I# ]5 v. e1 K
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    $ F. e  V* Y7 w5 i1 J3 }
  20.             -- 英文字母和数字
    , b* Q/ p* i; Z
  21.             @char LIKE '[a-zA-Z0-9]' OR
    # j! ?- ~! y8 r
  22.             -- 允许的特殊符号
    0 h1 i4 J) d$ r: M
  23.             @char LIKE '[_ -]'
    ( L2 X* W2 g3 x: P) J( w+ b2 n
  24.         )
    0 o3 z: E' ~; S! _
  25.         BEGIN
    6 G' K5 E5 B+ `& l5 P' T
  26.             SET @result = 1;1 w4 h) i8 I" A: a
  27.             BREAK;
    % s- E6 v$ t. Q  y: \9 z: q7 u8 a
  28.         END
    0 \1 Y! h' B5 e* s1 s
  29.         
    6 g" Z! t6 z/ G
  30.         SET @i = @i + 1;1 L3 Z6 X; |$ B3 P  V
  31.     END;
    . N  d, g" ^# \) |' q/ N
  32.     ( D6 }) r" O$ A& c  h; \) E, B
  33.     -- 检查是否在非法名称列表中
    & s- X  O# O6 p8 y6 O
  34.     IF EXISTS (
    ) Y% N# M3 \: f% }8 c' m/ ^
  35.         SELECT 1 ' B8 C. l5 L5 j' ~% ?% f! Z
  36.         FROM dbo.illegal_character_names
    0 n, B' K# w. x# X
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    " Y8 a' G3 S1 h2 V! U
  38.     )5 F, ?, |2 R( b3 j# i% `
  39.         SET @result = 1;+ `5 `9 |$ e) L
  40.     4 g. g9 ^0 g+ d1 b8 ?
  41.     RETURN @result;7 p" H6 r1 a! f- B" H( A* E: X
  42. END</span>
    # n& N( I' n# F2 k2 _! A
复制代码
插入屏蔽的字符
4 O: S, O  ^# P: f
  1. -- 插入非法名称列表(明确列名并使用N前缀)( |& T6 t" i) L( B
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    9 Q, p# q4 _0 O+ }
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    $ D8 c6 |4 K  p5 `, `2 O
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    6 J+ Z: @' ?( ~: w
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    ) Z7 u2 W: Q' t& B, T% U7 c- Y

  6. & p2 |4 v) u; ^& t# v
  7. -- 示例:查询包含敏感词的角色名
    6 ~# n+ c/ M& I
  8. SELECT * ) f' E2 T% a7 o0 x* g! A: ?- v) a
  9. FROM dbo.characters % _; G$ q( b+ U" @5 X
  10. WHERE EXISTS (& B* L0 r7 a3 }1 C
  11.     SELECT 1 ; ^6 `: p" W: C
  12.     FROM dbo.illegal_character_names . q  B/ m% Q/ X( Q
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    / g7 q6 O1 U% t- G& A) M5 B1 l6 _
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据' u& _7 ^1 D; O& q4 ^4 C
原始为:
- {: R" I6 n; W* ]; @( ~8 h3 w
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT+ s3 p6 ^* o, S3 j! w
  2. ! O* N5 c7 r2 g# r
  3. IF @v_ret < 0 4 L- q: X& x) X+ M' F- l
  4. BEGIN
    & l5 {  u2 Z7 ^1 m/ ^. H
  5. SET @sp_rtn = @v_ret
    ) s; G5 _2 @/ U6 g
  6. RETURN
    5 u0 W$ T* ^5 ^3 i" W# J5 O
  7. END
复制代码
修改为:
$ G1 U) A; N+ [9 B! |6 ^
  1. IF (dbo.NameBlock(@character_name) = 1)
    7 O. O* R, b' e" ~; I) A
  2. BEGIN2 {+ y- s; {0 k7 L+ p7 h  d
  3. SET @sp_rtn = -12
    / g* {* h2 v! K! g* A' W
  4. RETURN7 ]# }/ S# P( U3 G4 y+ E0 [$ S
  5. END
复制代码

. G+ b7 A4 L) p5 L
2 t& Z2 |& E+ Q, D, C# I# Z5 W) G$ H: W, D, h/ l/ `5 A: z# O' N3 G0 v; Q
) l0 W# ~/ z" s- x: g4 e
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2025-11-17 15:39 , Processed in 0.052828 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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