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

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

[复制链接]

155

主题

348

回帖

6179

积分

管理员

积分
6179
金钱
1868
贡献
3808
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
, U+ m  ?" g" \5 j0 N1 x
4 H& N& ]# H; z0 c/ p
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数4 u9 Z; p' w' ~; [+ N
  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 (/ @8 F4 k: m' C  y9 y/ d
  2.     @character_name NVARCHAR(40)
    * c, B) M& F6 L* z5 Z# w) H
  3. )
    1 v6 Q& G9 e0 g0 ^: g
  4. RETURNS TINYINT
    6 t. y# t5 C2 \$ g9 g
  5. AS; l& q$ A! N7 f& R4 Y
  6. BEGIN
    # J  d& w, Q6 \
  7.     DECLARE @result TINYINT = 0;* H& v/ \  z' b$ R1 y6 z0 x
  8.     DECLARE @char NVARCHAR(1);8 l/ {% N# n/ K5 g& ~/ C1 H
  9.     DECLARE @i INT = 1;- q  m) L+ c4 n" g
  10.    
    ( s4 s7 N6 a' a% _
  11.     -- 遍历每个字符,检查是否合法
    6 ?$ Y0 p" x& Q0 ]9 F
  12.     WHILE @i <= LEN(@character_name)
    4 n+ D+ o1 L7 v6 y
  13.     BEGIN$ ?8 F# T$ f* P, `( V0 |  j" b
  14.         SET @char = SUBSTRING(@character_name, @i, 1);+ e6 d4 p& m* _# d
  15.         - ?' E) @& r/ [/ Q. r
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    + B+ s* D) u0 `- C9 @8 x( ]. y
  17.         IF NOT (% m! ~9 T! Z3 {7 K
  18.             -- 中文字符范围 (基本多文种平面)
    6 V$ M( i4 l! O8 i* m
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR4 \2 R( i8 k; H3 B+ z2 _
  20.             -- 英文字母和数字4 q% X8 x  h$ T$ K# h
  21.             @char LIKE '[a-zA-Z0-9]' OR
    " W. f& {6 T) y" k" @. ~$ v2 y0 X
  22.             -- 允许的特殊符号6 a  X0 M' z+ M
  23.             @char LIKE '[_ -]'
    2 w5 n3 P2 V/ V1 l  n0 B0 s+ I
  24.         )5 Z3 }' P- n% V7 k5 A4 h+ O% L
  25.         BEGIN; q' f0 x6 R2 ^9 f, a; l
  26.             SET @result = 1;. g; q' _: A( _
  27.             BREAK;: K9 \! ~' \4 [9 W  r
  28.         END
    ' ~$ |2 e+ V- q: t( d) g# q, G
  29.         
      N6 M( f& N& N9 _: l- S2 b2 B
  30.         SET @i = @i + 1;
    4 }8 i6 G, q* r2 H9 u- E  C
  31.     END;
    . X( Z, i7 S4 M6 v! a! |
  32.    
    ! E4 M6 _4 i  V- h6 s% y" |
  33.     -- 检查是否在非法名称列表中* V8 l0 ], y  x5 B  ^1 b* Y: P# l
  34.     IF EXISTS (- @4 T0 \: J0 D& Y! Q; n
  35.         SELECT 1
    . `2 O. @: l$ o4 }" k" F/ E
  36.         FROM dbo.illegal_character_names - q7 c; e' R3 c; r: Z
  37.         WHERE @character_name LIKE '%' + partial_name + '%'& `- ?4 \" u1 u
  38.     )1 z4 G8 T9 C5 f/ J$ g
  39.         SET @result = 1;
    , X5 q- |7 m3 w$ C* V( K4 K
  40.    
      B( O: }! J9 \! I) E" l: M4 c
  41.     RETURN @result;  J. \5 b' h# W. ]' E7 m4 ]
  42. END</span>
    + W9 v6 X" s! L
复制代码
插入屏蔽的字符
& _3 ~9 B" z2 c; z1 F
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    % @& I8 b5 p3 J3 }& \, S
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    / x+ v/ n# ]. N" y3 q( h$ ~
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    / f; u) @8 h1 ?6 H6 }" I
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');+ j, V% D8 ?6 m3 u9 F) \
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    , T) s9 e& {# q5 G- U7 I! A( a
  6. " S$ y4 C8 U) J) F, ]& B" F
  7. -- 示例:查询包含敏感词的角色名
    " n/ j. h6 c  z4 z
  8. SELECT * / x/ [2 b6 S4 c  L" S! E* a/ \* d: d
  9. FROM dbo.characters
    . L4 _% x" F1 ?- }
  10. WHERE EXISTS (
    / q% y# m+ v: V" K6 k; m
  11.     SELECT 1 ) y' y1 A- t$ C) w% J
  12.     FROM dbo.illegal_character_names
    % l( f1 P0 m  e5 Z1 N
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%') H8 v4 {1 K) z
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
! M* M2 L1 N* b! F, W+ j原始为:
9 s( h6 o$ v! D0 y$ |
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    3 o6 `# }+ Y% z

  2. / e) a/ B) ^) G
  3. IF @v_ret < 0 7 T+ l: S% ~" e1 J6 r
  4. BEGIN) M+ c8 Q+ Z0 z
  5. SET @sp_rtn = @v_ret
    : \; x; y3 r+ ~  q. @, R- ]7 q
  6. RETURN
    + G+ R$ h& c, @# w
  7. END
复制代码
修改为:
* l$ @. k- M5 S! c, P* z' S2 H
  1. IF (dbo.NameBlock(@character_name) = 1); x- R* H' v! i" x! [2 J5 E- Y
  2. BEGIN
    ) R' q$ \2 g% w+ V; y6 Z
  3. SET @sp_rtn = -12
    4 [: w, @3 l* W
  4. RETURN9 ~/ _* q6 E& S, {/ `. K
  5. END
复制代码

5 E& p. s! m1 R6 |6 C, u7 X5 _1 _( c- p$ `" Z; k  ?
# F- X* j7 _. b+ g' V: Q2 j) |; p6 \

4 W9 d; O* {  h6 m* V* P
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-1-2 04:12 , Processed in 0.080577 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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