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

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

[复制链接]

166

主题

426

回帖

8133

积分

管理员

积分
8133
金钱
2380
贡献
5161
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表4 k, F" L0 V0 b& ~7 D  i
  d: i& Q9 H% t' N9 ?1 n
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数+ u/ ~4 `: i5 m/ s
  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 (
    ) U: J" ^4 I' G& S. ~7 Q
  2.     @character_name NVARCHAR(40)) D+ V4 O' G* k9 h1 ^1 T
  3. )
    1 z( c: `1 t( G+ v* T, ]
  4. RETURNS TINYINT* B( U' ~6 I$ j- r  F& t% L
  5. AS
    * X* B5 [2 {* ^4 b( T
  6. BEGIN2 M" N# G$ P' y: v! _1 ^
  7.     DECLARE @result TINYINT = 0;
    - ?1 B* x# @0 V
  8.     DECLARE @char NVARCHAR(1);
    2 t6 J& v( p2 p' W, X; j
  9.     DECLARE @i INT = 1;0 h, T4 x& @. J
  10.    
    ( v5 H4 J: M+ q3 S+ @
  11.     -- 遍历每个字符,检查是否合法" B* c$ P& r9 T* d2 g- I
  12.     WHILE @i <= LEN(@character_name)
    * U+ y: A. x1 f* W9 O. a/ S
  13.     BEGIN' L6 ?1 E& e: |5 H+ i0 o
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    & x4 g7 ~( [. u' r' }, k, F
  15.         
    - E* _, p" L2 m" M( o
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号  @6 B8 E! ]: S& O, l# n
  17.         IF NOT (
    $ F0 A4 f. o9 O4 p4 h  w1 c
  18.             -- 中文字符范围 (基本多文种平面)
    2 _9 m7 R6 V3 C  g- w: n# N8 w
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    / A! X& m3 X) J# J/ h# \
  20.             -- 英文字母和数字
    * N' Z* v) [& o1 {
  21.             @char LIKE '[a-zA-Z0-9]' OR4 i' g  L" F+ l) \: q9 |+ e
  22.             -- 允许的特殊符号: B: I& ?9 S' U% u. L
  23.             @char LIKE '[_ -]'
    1 T$ [6 }1 Q" v' b# H: a8 j+ c
  24.         )
    3 C! I$ V" n1 z: m+ }
  25.         BEGIN
    ( \! W) I8 T" \! Q$ D
  26.             SET @result = 1;( N+ r" c# |' ]
  27.             BREAK;
    ; R5 {# J" Z/ e
  28.         END
    7 s5 R( r% t: j5 W' a' P
  29.         
    % ?2 M! q* W9 g* U
  30.         SET @i = @i + 1;
    6 R+ X5 j) K( e
  31.     END;
    9 [; m5 @/ K; y* o% x. c0 w& h4 O' s
  32.     * |5 \5 Z8 p! y* c
  33.     -- 检查是否在非法名称列表中, N" S& O- }7 a) Q4 S
  34.     IF EXISTS (3 ~* a5 U) q$ d0 I) f
  35.         SELECT 1
    + l% d5 D3 k; o4 F& ]0 x* k8 U" B
  36.         FROM dbo.illegal_character_names
    ' U3 o/ v+ N2 y& g
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    5 p' [6 ]5 d! E2 V. s
  38.     )
    . L5 y; [+ q5 k7 A% s
  39.         SET @result = 1;
    7 G9 B% K. `) ^2 g
  40.    
    ) D+ [& @/ f( H9 X) O1 C. F+ Z7 z
  41.     RETURN @result;8 i% Z2 ?5 N$ M8 _+ o/ h
  42. END</span>
    - P% u  ?$ T+ {" O, H- q7 J
复制代码
插入屏蔽的字符0 Z! C. F' i/ m! z! y) l0 U
  1. -- 插入非法名称列表(明确列名并使用N前缀), y( n1 H# H! v% q2 `7 k
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    : l( X! W6 O6 h; l* S! ~' j9 w
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');0 O. n7 S' P9 E. j" O( G! Z
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');$ W3 h) F8 ?8 h4 ?8 }; y5 K
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');8 ?) u) |9 X' K% z8 O1 A7 Q
  6. + `! c: l0 D9 v1 }9 j6 x  G, r) f
  7. -- 示例:查询包含敏感词的角色名; r4 _2 v5 s  G8 l9 M$ M
  8. SELECT *
    ) R! @1 A8 ]) O0 H
  9. FROM dbo.characters 8 |8 p! T6 s/ Y+ O
  10. WHERE EXISTS (, |- f3 U) n9 k5 w9 C% l! l0 z
  11.     SELECT 1
    * U" ?+ n5 z' U
  12.     FROM dbo.illegal_character_names : K) P! ?/ p8 v# e& M8 q
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%', D0 G4 |2 y5 F" H6 `3 R: ^5 E9 _
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据+ y+ R6 z3 J: D4 g' j# L  g6 u
原始为:$ `  M6 ]: r5 t- |. c) E
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT3 I. s! N& \1 y
  2. ( J3 b) b) P9 i9 `2 t/ u
  3. IF @v_ret < 0
    # p9 [  B2 l  `6 E2 b
  4. BEGIN
    6 h% y7 D, ^+ s+ |0 ~& ^/ V
  5. SET @sp_rtn = @v_ret1 ~* ~6 e! k( ~
  6. RETURN5 |0 U. b! L7 \" R: W9 [. ?& A
  7. END
复制代码
修改为:* a+ J, ^9 o4 Q/ n
  1. IF (dbo.NameBlock(@character_name) = 1)3 D9 ^5 j1 {4 |0 N' \0 a
  2. BEGIN
    ! t* J4 U4 M% R
  3. SET @sp_rtn = -124 w' R/ q5 c. g
  4. RETURN7 L1 B4 w1 u8 I1 A
  5. END
复制代码
" V5 W( @0 s2 `9 s& ~

7 V  D  ]  ~! f+ R) I3 P8 \( z
2 R; j/ m8 }: p+ `. e9 U) e
/ {  z2 ~; b+ p4 d6 [3 n, J
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-9-30 20:27 , Processed in 0.063847 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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