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

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

[复制链接]

161

主题

397

回帖

7590

积分

管理员

积分
7590
金钱
2201
贡献
4831
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
+ `; x  y; q- [: b6 p
) Z# s% A$ x6 Y4 h2 Q$ P
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
* J) Q9 y% x/ K, [0 V& N1 ]
  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 (
    , H, \: S( D! _6 K
  2.     @character_name NVARCHAR(40)/ I2 u5 k% b( N8 p: V/ A9 x
  3. )( y+ p$ A8 s/ {/ K+ _3 X" v' ~
  4. RETURNS TINYINT
    - ]: @: m2 \$ X+ f
  5. AS& G, R# a% h# F& K4 ^# V
  6. BEGIN
    / d, i: i" E1 p3 J# y! q
  7.     DECLARE @result TINYINT = 0;
    6 ]. Y# w# Q' w; C4 w  u. w
  8.     DECLARE @char NVARCHAR(1);
    % {  D% ~7 r0 R0 b, Y
  9.     DECLARE @i INT = 1;9 F5 T' `! T! U' O9 q
  10.     ) x, R/ e" B' T6 Z. f6 Y. \
  11.     -- 遍历每个字符,检查是否合法  s8 Z6 f' r' u2 s+ }, w3 ^0 Q
  12.     WHILE @i <= LEN(@character_name)0 L8 H4 t+ R* ^
  13.     BEGIN
    6 d+ N& ]" k3 U) G4 T0 K8 y) E
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    - Y. H8 I1 w1 s! J
  15.         8 p! H9 [% q5 S6 G
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    ! g* F* G6 o- ^2 l3 @
  17.         IF NOT (
    + ^( N+ z5 V! \5 j2 ?1 W
  18.             -- 中文字符范围 (基本多文种平面)
    $ H& f$ p% ^* N+ c7 r1 a
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    ! B' Z1 O: t7 D8 O3 \) Q; @
  20.             -- 英文字母和数字
    4 P/ `- G; g# N& ^& c
  21.             @char LIKE '[a-zA-Z0-9]' OR3 Z2 i$ Y% C2 y$ R) \% r2 |
  22.             -- 允许的特殊符号
    . d1 G0 Q' k3 `" o! c; T, V
  23.             @char LIKE '[_ -]'
    - {+ x1 E" t' I+ j
  24.         )
      W7 `: C' ^3 s' Q6 K$ f  _# A
  25.         BEGIN2 C" i7 e( T% v
  26.             SET @result = 1;
    6 y+ R( l! z. Y8 p5 z
  27.             BREAK;
    ( m* E8 \( ^9 m. X% I" f
  28.         END
    + Z) }8 ~, B: `, p9 W& }8 Q
  29.         
    $ p: w9 I5 F7 ~* c4 g6 M
  30.         SET @i = @i + 1;
    : I' q7 t5 w2 C% Q" A
  31.     END;7 o9 Z7 ~3 z- b8 z" ~
  32.       y8 I2 I: |- I2 V% G/ v
  33.     -- 检查是否在非法名称列表中3 I8 b. Q/ q/ K) R2 r
  34.     IF EXISTS (
    % o; y6 G, T1 |/ J, Q6 _; u4 T
  35.         SELECT 1 ! N% m, s( F+ y* [. ~* g/ w# _
  36.         FROM dbo.illegal_character_names
    + ?$ ?5 o6 p" R0 Q
  37.         WHERE @character_name LIKE '%' + partial_name + '%'( c  W; x* I; L9 l
  38.     )
    7 ?7 I9 m$ w# W8 P! h+ {& L# J7 A
  39.         SET @result = 1;" A- R2 ?" S" _
  40.    
    - V* L- c* V* R7 w  Y
  41.     RETURN @result;
    , a, x. s3 H: b9 G/ p
  42. END</span>1 v4 }7 b3 B# O8 \, S6 v  d
复制代码
插入屏蔽的字符& y: N1 W1 J8 g# q/ d
  1. -- 插入非法名称列表(明确列名并使用N前缀)
      U! Q6 {6 s* \/ R
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    1 b( U& E, [4 v! G2 b. {: v
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    2 |. w3 ~+ t) r7 d
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    * g+ u$ Y1 o- G) y' x1 H
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    0 G7 N9 u; i4 h9 d; O4 \

  6. : ~6 m* v/ f- Y8 Y+ k+ |
  7. -- 示例:查询包含敏感词的角色名( r: Z. P. h8 `7 [/ r2 r
  8. SELECT *
    / K6 J' x4 G$ c5 I. ]; v  ~6 x9 z
  9. FROM dbo.characters
    : P6 a% W, W7 ^5 g* A% ?
  10. WHERE EXISTS (* _3 r0 g5 `9 m9 d3 N' o
  11.     SELECT 1 ; p, A$ s* j' K$ e* k) C
  12.     FROM dbo.illegal_character_names
    . ]' u; E8 p  w  y
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'# [- R+ G" v- z  v- Z& u
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
6 g  T& X$ F1 E$ Q/ X. e原始为:
8 p8 W6 k$ |0 F7 A  b0 t
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT0 v! `( ]' n8 F3 v9 k# I+ {; U; Q

  2. 5 E9 b$ @. b' e  x2 m, Y
  3. IF @v_ret < 0 ' Q) J8 {6 C+ b. x1 M+ R; l6 `
  4. BEGIN3 i% o$ q' W0 N8 M9 r
  5. SET @sp_rtn = @v_ret
    " G. R7 i5 a3 @5 y/ N; s; M1 v
  6. RETURN
    , u5 f7 {; ~! r0 f: g: G) P8 }
  7. END
复制代码
修改为:
1 n: g3 |5 q( a$ e& e
  1. IF (dbo.NameBlock(@character_name) = 1)% ?3 Y1 C, I* R$ K( J
  2. BEGIN
    - m9 S  B6 E3 y0 I
  3. SET @sp_rtn = -12* I9 u' j! f" r2 W' r
  4. RETURN% u) H" n/ _7 j( V/ w% |
  5. END
复制代码

# {* H0 c4 z2 v8 L% ~7 o; v# |8 j2 B" j& H- |+ j
* `, X( s$ z- v( V# ^
5 J+ s' c  }  y7 \9 _
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-6-3 02:31 , Processed in 0.035217 second(s), 29 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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