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

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

[复制链接]

164

主题

416

回帖

7820

积分

管理员

积分
7820
金钱
2282
贡献
4958
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
( U( `+ O% H9 i) |8 _" \( u( C
9 b1 @9 g( `) K2 X, V8 v
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数( Q& C1 F! v. Y: w
  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 (
    ) b: F+ T8 e6 N
  2.     @character_name NVARCHAR(40)
    : n6 ~9 V$ \$ Y* I
  3. )
    $ ^5 Z9 [; ]4 k2 G3 r, b- n  I
  4. RETURNS TINYINT
    6 y) L( f" {& N; N) v  |: ]
  5. AS6 f. g4 v" @/ g# {# T
  6. BEGIN
    * `; f) `$ h9 r. }" x) k
  7.     DECLARE @result TINYINT = 0;
    ) Q7 T. ?" T) j+ E" R  z5 e: ]
  8.     DECLARE @char NVARCHAR(1);
    9 j: `! J6 H) U* T( }; j. @, ~4 I9 ^: W
  9.     DECLARE @i INT = 1;( I/ N$ X- m' E8 c
  10.    
    2 _( k$ }1 o* Y
  11.     -- 遍历每个字符,检查是否合法) {7 G+ D: x, g9 {* ]4 X
  12.     WHILE @i <= LEN(@character_name)0 F6 M; Y) `) ^
  13.     BEGIN$ r, h% x8 g2 p
  14.         SET @char = SUBSTRING(@character_name, @i, 1);$ l7 X: Q6 Z: ~: R9 _$ E
  15.         ; w4 \3 N; g; g' E
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    3 r1 Q' Q  c/ v5 v
  17.         IF NOT (( K' w" V6 @8 L8 A
  18.             -- 中文字符范围 (基本多文种平面)1 N9 Q/ B7 }# M7 I5 H/ d
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    : B: d% p& E, Q' s2 F
  20.             -- 英文字母和数字
    0 g+ J/ h+ h; \4 D8 @# G
  21.             @char LIKE '[a-zA-Z0-9]' OR9 f4 u0 ^: X/ {2 B4 R4 x& S
  22.             -- 允许的特殊符号
    / J, S7 ~/ r* F1 j4 b9 x: e( P
  23.             @char LIKE '[_ -]'
    9 m4 D2 X! m+ |; e! t# t
  24.         )
    ' q5 ]& u" d" v. |! t" e% j/ D5 v/ I6 u  G
  25.         BEGIN' S0 k5 ~9 P) s( ?3 `, E
  26.             SET @result = 1;( q+ W" |7 x0 c; M1 u/ X& l
  27.             BREAK;
    6 u% A, g1 m5 i- }9 l3 c
  28.         END( r: G  \+ S9 h
  29.         
    " {* H5 B6 P4 a! l& {
  30.         SET @i = @i + 1;
    2 \* q% t5 x* ^% r% n; _
  31.     END;$ @( o4 I8 {: J/ {5 g* x
  32.    
    + p$ f# ?6 h6 T) G
  33.     -- 检查是否在非法名称列表中
    & C! u2 w- A. Y4 K5 y
  34.     IF EXISTS (4 \& U$ R4 i7 F: l2 v  O' c2 v5 `
  35.         SELECT 1
    ) }% V6 D8 J% D/ r& M  G: R% \
  36.         FROM dbo.illegal_character_names
    " I5 f5 M. v5 [0 @( T8 j  e
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    ) e& y/ e* a; c' h. N, f
  38.     )
    2 d/ E: S( J' w6 S, u
  39.         SET @result = 1;' {  v( P# c9 U+ `
  40.    
    & I9 o: R0 L( j6 `% Y" ]' j
  41.     RETURN @result;5 ^2 s6 F% P+ j& @3 `  Q
  42. END</span>  C/ I1 l' R3 T
复制代码
插入屏蔽的字符$ \; S' N: P" L3 h3 G! Q4 ^: c
  1. -- 插入非法名称列表(明确列名并使用N前缀)0 [7 @) H8 ~( |, X/ J3 Y- c
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');; m* S" ~3 `& e4 m
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    - i- ?6 E9 M* ~) K, D* C/ `
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    5 Y% I, y3 X. i" C5 V( S7 V+ Q
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');7 L! ~' q0 J% A: f. \. n' c6 V* j, Z* \

  6. . g5 i. m/ m- J" [- i2 ^* y3 ^( T
  7. -- 示例:查询包含敏感词的角色名$ [) z' |" t' O. @; I3 F3 Z5 F3 F
  8. SELECT *
    6 p! E  f1 R2 C/ Y- y
  9. FROM dbo.characters 1 E6 g# d5 a) b6 Y- U1 q6 R
  10. WHERE EXISTS (
    2 U3 ]' r* G' p
  11.     SELECT 1 7 r1 R% |* S4 n  Z. N$ h' Q
  12.     FROM dbo.illegal_character_names 9 E  ?& I) d3 R+ H2 }+ O4 L% r
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'& ?% A( ]% p  [( J# _+ C
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据* j! ^  d! u" r! u9 X) n' K
原始为:2 R, \6 W! `- W" R, V9 }3 L% A) ?' h
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    $ W  [2 e( A8 e$ T( ]% a/ y
  2. * K/ h- _6 Q9 T+ a5 y' \
  3. IF @v_ret < 0
    * X+ a+ r! M0 c' q7 I
  4. BEGIN% [$ T4 G+ Y2 C: `9 C
  5. SET @sp_rtn = @v_ret
    ! |7 [! I3 W2 a0 B( N: p
  6. RETURN
    - x; m, B/ T" |# ?3 L6 P
  7. END
复制代码
修改为:) k6 L1 L" p1 {
  1. IF (dbo.NameBlock(@character_name) = 1)
    * s6 v$ J0 F& E6 D
  2. BEGIN4 Q  V4 E' i4 }
  3. SET @sp_rtn = -12
    / G$ K+ G+ R+ H
  4. RETURN5 a' h3 Y/ N+ u* j  C
  5. END
复制代码
+ J5 F& L. n) U# z, v4 G+ i$ }* x& n; J
5 ^* w2 H  U- M" W2 _

% ]: I$ z5 L, s

) l- K- r' A" a$ E) X$ Q
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-7-3 07:44 , Processed in 0.056429 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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