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

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

[复制链接]

152

主题

325

回帖

5593

积分

管理员

积分
5593
金钱
1773
贡献
3343
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
7 ?' n+ [; s. u9 p  b: X7 A% G, M# C1 a# L8 i
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数; E. \9 M! \' I  T
  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 (' {1 |; K" v, z! y% ?; L
  2.     @character_name NVARCHAR(40)5 F8 H/ M  V" A# [% S
  3. )
    ! {& v& |6 h& q& c
  4. RETURNS TINYINT3 @) X& ?: S' F! B
  5. AS" \  r  D5 z0 ^+ K
  6. BEGIN7 O; I4 u: f, C# A) f
  7.     DECLARE @result TINYINT = 0;
    + a5 P, c5 k2 a' Y4 P2 Z
  8.     DECLARE @char NVARCHAR(1);
    8 ~; s* E% B# a! h0 I
  9.     DECLARE @i INT = 1;
    3 _" l; I5 @1 g+ n/ ?
  10.    
    & i* b1 y0 R4 @5 `" u1 Y
  11.     -- 遍历每个字符,检查是否合法/ F% @0 J; t5 g  @% I! r& ~' ^
  12.     WHILE @i <= LEN(@character_name), F- ~) r: ?  g! o, t
  13.     BEGIN9 V* X9 W$ a: @0 B, y1 W
  14.         SET @char = SUBSTRING(@character_name, @i, 1);9 F9 Q( r5 W4 g+ i8 S& y
  15.         
    7 ~6 M" S) d6 @3 |
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    / K% a- B; E5 P$ v' ?
  17.         IF NOT (
    + |: D6 X+ q+ k
  18.             -- 中文字符范围 (基本多文种平面)
    1 ]" C+ @" Y! _. s1 ^
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    4 t- i/ z; N3 u1 {; E  `
  20.             -- 英文字母和数字
    % z" b: Q& F5 u2 A4 K& x
  21.             @char LIKE '[a-zA-Z0-9]' OR% o$ \1 W- ?$ L3 m7 s/ S3 ^. r) w
  22.             -- 允许的特殊符号5 E0 m4 F0 r, G5 ~5 A4 ]1 X' r
  23.             @char LIKE '[_ -]': a8 I$ i  |4 B6 L
  24.         )
    + _, `7 O# S% H" ]
  25.         BEGIN
    : s# e6 m2 ?! e- T6 u7 p4 \% O
  26.             SET @result = 1;+ T# o& n- |. X- j% v
  27.             BREAK;
    . s) }6 t: t7 \  F1 I
  28.         END
      P& p8 E$ h) p& z5 u
  29.         ! S( s/ V, D, O# L9 M/ t) e1 o
  30.         SET @i = @i + 1;
    ) ?; H' N- B. h0 W9 I; [4 B. z& z4 V: ]
  31.     END;- r( I" I/ X' T  _# i! x4 `& P
  32.     ) a0 t. p7 c, a% j/ @" k  N
  33.     -- 检查是否在非法名称列表中
    7 x" D0 y# g7 j
  34.     IF EXISTS (: q6 @$ q* C  r1 b. {
  35.         SELECT 1 3 `" c- e- q3 g. v1 O0 Y
  36.         FROM dbo.illegal_character_names 8 ?" x9 j4 H: m$ w) F( J
  37.         WHERE @character_name LIKE '%' + partial_name + '%') g6 `* j* T& C: g
  38.     )
    4 k! G( D5 }5 }/ B5 C5 j2 A
  39.         SET @result = 1;
    % Y2 J4 F# W" i3 X) k* v
  40.     2 E$ z6 J4 C" }% E5 Y1 M
  41.     RETURN @result;% Y2 J: B( X2 _8 [/ \& b: t
  42. END</span># N7 C" w. M4 |, H
复制代码
插入屏蔽的字符" w+ \. M& v8 Q: h, r
  1. -- 插入非法名称列表(明确列名并使用N前缀). q. G) j& B5 [2 w3 K
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');$ E; [' y% c+ A& h5 v2 M
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    # i. z9 \8 q% P  F
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');  S9 V. U/ R7 ~% Q
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');, w6 ~- H: f- e* ^7 N2 K6 F
  6. / O" w( d/ p3 g% Y4 j+ \
  7. -- 示例:查询包含敏感词的角色名* b0 K1 O3 o; A  S* |
  8. SELECT *
    6 y& a  R' F  ]. S: J+ ~
  9. FROM dbo.characters
    4 {0 }  d+ a# A
  10. WHERE EXISTS () Z. d7 l- Z" O% P7 K& v
  11.     SELECT 1
    2 ]4 l% t. ?# ]( s
  12.     FROM dbo.illegal_character_names $ e0 t% f6 F3 s4 L2 ^1 h# S
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    + `# A5 ^) b* [+ j
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据0 U$ x& Q8 A$ l
原始为:7 H$ \# P! @+ R; l: @
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT! x5 u8 g  E# k* g

  2. ; G0 }" T7 R7 V  E3 x- ?
  3. IF @v_ret < 0 , l7 R9 H+ G. ^
  4. BEGIN: y! r$ f5 A8 M/ U3 X
  5. SET @sp_rtn = @v_ret) ?2 o+ \: [9 q% H& `, f
  6. RETURN
      u, I* z6 M* g/ k) T
  7. END
复制代码
修改为:
4 r, i  y6 h" k: i# ]
  1. IF (dbo.NameBlock(@character_name) = 1)( q3 x& S, K& g; l* k8 \
  2. BEGIN. t& f4 v$ z* G2 W! H: K
  3. SET @sp_rtn = -12; X) t, }5 f% g% h: m
  4. RETURN
    ( n' g! }. p2 h: g, r
  5. END
复制代码
. w8 i' Y& m  c/ C2 B* {
( T& i8 V7 m; g$ Z% s2 u

, i3 Y* r# J: ^* ~; J! g! }
" v7 f5 ]* C3 G7 r" k
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2025-11-9 03:07 , Processed in 0.052157 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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