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

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

[复制链接]

157

主题

362

回帖

6846

积分

管理员

积分
6846
金钱
1946
贡献
4381
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
" P6 X4 v# {7 b4 l% R% q( [# f; _; ?
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数- ^# p. }  F& |' ^- ~
  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 (* d5 ^5 M: Y5 t
  2.     @character_name NVARCHAR(40)
    0 b7 X( ~0 `/ a% Z
  3. )
    : [( X1 r' e/ ^0 t
  4. RETURNS TINYINT+ g; e- ~( X' Q% |6 s
  5. AS8 t" A* w' c) q& n; N$ E' @
  6. BEGIN
    , Q6 j5 h: ^6 N. s# y
  7.     DECLARE @result TINYINT = 0;
    . p3 d! q) {3 C* K5 {  o) I
  8.     DECLARE @char NVARCHAR(1);
    , C1 k; c0 G/ C# j
  9.     DECLARE @i INT = 1;/ o( g  v+ f! O8 G
  10.    
    4 a5 a0 @) N! Y1 e
  11.     -- 遍历每个字符,检查是否合法7 `+ J+ \+ M! n- N' D( x& ~6 K
  12.     WHILE @i <= LEN(@character_name)
    7 w- `, S# p2 y2 _5 ^* e
  13.     BEGIN
    $ h1 m8 t, [. R" }: e5 _
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    : @( ~. r! ]) M9 T# U- Y' L' ^
  15.         ) Q  k  ^% y* c+ k
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    & s" b7 u" ]8 j% {
  17.         IF NOT (0 L* ~4 n$ Q  j. b# Z  Z" y4 n
  18.             -- 中文字符范围 (基本多文种平面)
      w9 q$ S  o' ]2 P/ ]
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    3 u# E6 m- t+ m' ?- N3 c
  20.             -- 英文字母和数字
    4 m' x8 ?% R7 {$ B" y  i- d
  21.             @char LIKE '[a-zA-Z0-9]' OR$ n. \" n3 U- \7 Y4 D- |3 Q$ a
  22.             -- 允许的特殊符号
    * L4 g; p: z, U* N# u1 S
  23.             @char LIKE '[_ -]'
    ) X0 H' m. p( _( A4 Z3 U1 ^+ q
  24.         )9 P/ p+ t. r: |
  25.         BEGIN: g0 g6 l8 q2 w8 y
  26.             SET @result = 1;
      c" z0 [6 }, Y* u1 S
  27.             BREAK;
    # V# I4 s; a/ E- P# ^; o
  28.         END/ I- x1 }- n# r! S7 t" T
  29.         * {+ b9 }' s8 S9 c/ w" j9 l
  30.         SET @i = @i + 1;" x. q# E8 h6 J/ v& m, r
  31.     END;
    $ T) b  o/ b' a
  32.    
    + |& q- @- t" Q& e
  33.     -- 检查是否在非法名称列表中$ F6 A: @+ H( @- j% x+ Z3 b: l6 m
  34.     IF EXISTS (5 _* v% u" N: Y. Q# b: z
  35.         SELECT 1 9 u8 k* z0 y  y# t, x* J7 v
  36.         FROM dbo.illegal_character_names " R# s* \+ D$ I' g' M
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    ( f! t, @9 {) ~; r. o
  38.     )
    - s6 c  {9 q& R" t; `7 D
  39.         SET @result = 1;
    9 g$ o- W8 T$ w1 O
  40.    
    4 i/ m+ N! b. Q4 \% _
  41.     RETURN @result;  ^5 |; T$ ?# q( Z
  42. END</span>
    ! s" @% }  g8 s. P
复制代码
插入屏蔽的字符& F  O" E9 v- o( v, v( S
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    0 m& b, L" D0 X) j! G9 r& b
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');; b# m+ p  R5 L: z3 z
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    5 @  A. ], B, L% |! y# B5 G$ r
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    3 X; A  V: K+ v: V5 r( ~
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');( P% i+ t  }3 K. x; i

  6. 2 o$ X- i. W+ [9 r
  7. -- 示例:查询包含敏感词的角色名, _. x, E0 v! [, [- v; L9 e1 I9 o! ~+ b
  8. SELECT *
    4 L$ \) f& h# [  A# r$ g
  9. FROM dbo.characters ( \" S( w9 H/ `0 O% Y9 L8 D8 o- T) L
  10. WHERE EXISTS (
    + j6 G, z6 C4 H8 w- C
  11.     SELECT 1 ) f2 n8 y3 H+ X; F) {5 y
  12.     FROM dbo.illegal_character_names 2 `% ]( t" K' ]" M1 O# T' i
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'  c" H4 \. a) g% o- B
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据: w$ ~- [3 y! f0 r6 M$ E
原始为:: Q" e; q& L% |' }! E4 T' F0 F! k
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    + b. u0 ^* m/ I' }
  2. ( ]- v) V8 I! x' H2 f
  3. IF @v_ret < 0 / B7 p, U$ n) o, u
  4. BEGIN2 N- H0 f. S5 ]/ }9 c& m
  5. SET @sp_rtn = @v_ret% T1 M6 f5 v  L1 z+ t5 w6 F
  6. RETURN
    ( ~+ ]- `' w5 D. T& j
  7. END
复制代码
修改为:
+ @% a0 G+ k, H( b
  1. IF (dbo.NameBlock(@character_name) = 1)9 H$ a2 K: `. F6 I3 |. p
  2. BEGIN
    % y+ l5 ^% M5 r
  3. SET @sp_rtn = -12' ?' ^4 p- t% p. ]
  4. RETURN
    4 Q+ \" K. s  M' |
  5. END
复制代码

" x" U* D% O' ~. T/ O( t3 R- H9 \0 V
0 Q' D0 G6 t* w7 r2 P& o( t, O' E& c# m$ `
4 T  V5 {" m. P- g, g
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-2-19 08:30 , Processed in 0.047297 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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