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

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

[复制链接]

165

主题

418

回帖

7948

积分

管理员

积分
7948
金钱
2328
贡献
5037
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表% z' ~" O/ t' W

/ [! h0 ^3 X; i% k9 ^, i; y6 C6 c
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
1 H- D2 _. b4 j
  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$ M) u" u+ O9 N+ w
  2.     @character_name NVARCHAR(40)' T: R6 g) ?. q4 k9 }, {3 m
  3. )
    # L' Y7 C  _$ c5 B& R
  4. RETURNS TINYINT2 r) O' f; o* W$ a. m
  5. AS
    + [$ F; _9 e5 h9 h5 m4 m
  6. BEGIN8 Z0 [3 k- d$ a( h5 ]7 z
  7.     DECLARE @result TINYINT = 0;$ L) x1 M5 L" G; P5 \
  8.     DECLARE @char NVARCHAR(1);
    6 ~% Q5 n# ^$ T/ Z) N8 j  {: O
  9.     DECLARE @i INT = 1;% }, E' L) d" [2 ~# F9 H
  10.    
    4 }# A. ?. x1 M
  11.     -- 遍历每个字符,检查是否合法8 j& X' g+ u! I3 r' H
  12.     WHILE @i <= LEN(@character_name)/ T- z3 n7 ?4 e
  13.     BEGIN
    1 ]2 f2 h' O+ d& G1 n  X! j9 F/ O
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
      M  Z1 r% s/ L( Y& c. a* [# B1 \
  15.         7 F) z0 ]2 G( A7 l: J5 m
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    % f6 F" H" I# G, S4 a7 m
  17.         IF NOT (. I: q5 j! M. S
  18.             -- 中文字符范围 (基本多文种平面)
    1 O+ I8 d/ ^3 G
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR3 ~% S3 \( p5 n' b
  20.             -- 英文字母和数字
    % ]- {) \# q6 Y& \* a# u
  21.             @char LIKE '[a-zA-Z0-9]' OR
    ; n! s, V+ Z( ?) A0 W! B
  22.             -- 允许的特殊符号
    + x- y  z/ ~. R
  23.             @char LIKE '[_ -]'( Y. e0 f1 m5 X" i" ^
  24.         ); y5 H  V/ Y$ ^1 f# k  ~1 w/ F
  25.         BEGIN( Q/ i/ G  ^8 W
  26.             SET @result = 1;& m! k# u) P* n6 [" m
  27.             BREAK;
    4 {9 C- N" Q* E. S
  28.         END
    2 P# Z4 w( L9 X  [6 w1 _
  29.         
    ! j" D5 k1 p: O: Y
  30.         SET @i = @i + 1;
    / U7 E+ j5 H) L& S
  31.     END;' u7 a2 j# U' i
  32.     7 K6 I3 J6 i  Q7 l
  33.     -- 检查是否在非法名称列表中
    5 q# u, ]+ y- b1 c. t& ?" J
  34.     IF EXISTS () Y. m; E% q; e' ^; v0 o& e
  35.         SELECT 1
    ) q# x$ l" L; Z4 b& R9 D) l
  36.         FROM dbo.illegal_character_names ! K+ f; i/ l4 X# }+ t
  37.         WHERE @character_name LIKE '%' + partial_name + '%'2 Z" p- P& s1 }  J' r7 U
  38.     )  i, q& s+ ?: S3 t: L* p) M' J/ G
  39.         SET @result = 1;- g' o" S+ R. O
  40.    
    ) y" C4 t! X$ {% w
  41.     RETURN @result;
    ' h7 a" s+ I0 z1 ^0 v, W
  42. END</span>/ v/ m, Z. R* L. r+ q$ }5 u! U
复制代码
插入屏蔽的字符
- I, Z) m5 G5 B% S
  1. -- 插入非法名称列表(明确列名并使用N前缀)2 d! O* R5 t# N. s
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');: r+ b$ A, n5 v2 p" [) ]
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
      H& b* G3 f' d" ^- Z
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');% ~0 D' g/ k; {. Y3 V
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    7 U' w2 J( m6 l+ h4 n* P8 x
  6. : O: l) R% ?& n2 f4 F2 Z" ^( `
  7. -- 示例:查询包含敏感词的角色名
    3 i. K" O: w" p$ ~! m) I7 B
  8. SELECT *
    3 A) S* o) r3 `
  9. FROM dbo.characters & g1 k5 ~* R5 e4 t3 a
  10. WHERE EXISTS (
    # a. L: e& u( {' U9 t( w
  11.     SELECT 1 9 N& }& T4 c" ~$ n1 R
  12.     FROM dbo.illegal_character_names ! |/ J& R& ^; }0 j/ v: h
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    $ o# i* X3 z/ h9 a2 f
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
& }+ U' X7 w, V) E% U原始为:+ G% u5 [3 K/ O
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT5 w1 L* d: [7 j: y

  2.   e" j7 o: m/ _' Y: P- }
  3. IF @v_ret < 0
    0 q% i! @" x; o9 D4 k
  4. BEGIN
    6 D' i% n) t( s
  5. SET @sp_rtn = @v_ret& C. `3 n% m" L+ G
  6. RETURN9 I: Z) K) x' o- m+ `
  7. END
复制代码
修改为:# a1 H. O5 O( v6 G! a  L0 d: w, a
  1. IF (dbo.NameBlock(@character_name) = 1)
    ( b1 m0 n( J; @; P: v. b: n
  2. BEGIN6 d8 C$ {" {/ u; a# u- p
  3. SET @sp_rtn = -124 H% E& x' D, f5 u. T3 x
  4. RETURN
    . \. x8 I5 x' y0 _; w
  5. END
复制代码

* O) m: t) k5 N  G% {7 m" U& b$ M% c! {9 Q( {

( }/ b  I4 v: O3 G, C
; T, F, m1 u& Y" v& P2 O; d
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-8-19 05:50 , Processed in 0.065692 second(s), 30 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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