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

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

[复制链接]

161

主题

389

回帖

7476

积分

管理员

积分
7476
金钱
2161
贡献
4765
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表) F, u+ f9 o- p3 U' `0 |8 @1 A* b

# G' C7 q# c# r) V3 o- t8 F
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数5 o0 Q. y8 }0 I
  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 (% g) b7 N: b- l2 E7 a
  2.     @character_name NVARCHAR(40)4 @# m7 n( c, R$ k
  3. )
    ( b/ [  }. s; T& H8 [! k+ X8 p
  4. RETURNS TINYINT
    : H; `) N1 d, y( h% T8 K) q1 A
  5. AS
      I' d- j# T: s# w& t
  6. BEGIN* X, Y. _& X; ^
  7.     DECLARE @result TINYINT = 0;. Q/ T1 e8 Z; `7 _( r5 F! n- N" X3 @
  8.     DECLARE @char NVARCHAR(1);: j/ ^) f; X6 u. g/ T5 t! [
  9.     DECLARE @i INT = 1;
    - H$ h3 m; p9 ^2 C
  10.    
    4 d6 [% U$ }  q& X5 Z$ O
  11.     -- 遍历每个字符,检查是否合法4 Y& Y9 s3 h' \( A4 f% e8 O
  12.     WHILE @i <= LEN(@character_name); _: `( F7 P* }7 V1 ^7 w
  13.     BEGIN$ _, m5 c6 y& H* y+ p5 _
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    4 E. M  G3 u# S) Z+ U' b
  15.         
    . q, H3 e# ?  e5 w2 H; ~
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号! e7 Z# O: I# a5 A# X% p
  17.         IF NOT (6 m# d2 H; v0 X3 V  c  U
  18.             -- 中文字符范围 (基本多文种平面)
    % d- h6 u0 m1 G: u+ O$ U/ d
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR) Q& l3 r% X) B, e! J
  20.             -- 英文字母和数字8 M/ A1 ]) p  E) S2 v
  21.             @char LIKE '[a-zA-Z0-9]' OR6 q1 W1 ]5 X4 Q/ ]0 o
  22.             -- 允许的特殊符号$ ?" v0 F7 h8 Z$ r/ q7 C# q
  23.             @char LIKE '[_ -]'0 O+ `. s2 s  ^4 d( G* k
  24.         ), w0 u& A9 B6 @: s' ^
  25.         BEGIN
    : P* @) ?7 |0 f4 U
  26.             SET @result = 1;( m7 i; {' ^& D
  27.             BREAK;
    / U+ n% S$ ^' k/ W8 B+ g* ^9 y* m$ ^
  28.         END
    1 b9 _/ \' v! j+ m1 y
  29.         
    7 O+ ]8 @, u2 V1 v; i4 N6 q% H2 X
  30.         SET @i = @i + 1;
    9 E& i# }0 {9 i# O* }. C" h
  31.     END;
    " ~7 `' S/ e+ C( W& E
  32.    
    + i+ u6 K/ ?' W' T
  33.     -- 检查是否在非法名称列表中& F2 k; |! Y% @2 k! B) f  s
  34.     IF EXISTS (6 v8 ^/ y% `/ h
  35.         SELECT 1 ; Z* n! _8 P- C/ c  T! B
  36.         FROM dbo.illegal_character_names " ]6 Y7 A7 U2 \  R3 x
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    6 b8 N1 S* `; K; Q8 V: h* D3 ~
  38.     )( \' I( h/ V. S4 b
  39.         SET @result = 1;
    4 v! Z+ ~5 s9 |& q  \8 t' G/ t% ]
  40.     ! O9 h" {; [4 b$ d, \
  41.     RETURN @result;
    . A/ F3 d6 l% k: f( p+ M
  42. END</span>) F- E) I0 l& i% b, m
复制代码
插入屏蔽的字符$ c# ?5 X: X8 D3 W) }# K/ N
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    ) m0 O6 L/ f; Y! m; {) c7 |/ _% Q+ P: ]/ ]
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    * m" P' N1 I4 P% J& y* g7 J3 O* Q0 y
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');: `% s4 L8 R4 G
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');9 n; U+ }$ q% m
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    9 h4 F$ `0 R9 s

  6. & |+ \' s; g  B
  7. -- 示例:查询包含敏感词的角色名3 P. Q1 _  Z3 X) [0 T
  8. SELECT * ; j- @8 M5 f: s7 N7 E9 q
  9. FROM dbo.characters ' e, ~( A( T- I: _
  10. WHERE EXISTS (, s- N! }, b5 E1 s4 ?4 D
  11.     SELECT 1 : g6 v3 k" N6 q$ u% Q, v
  12.     FROM dbo.illegal_character_names
      Y$ \: t0 T8 D/ C+ ?- I, Q
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    : H- L: j* F2 W9 Q, h
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据, N' N( `0 q+ g# T
原始为:8 a1 c! k8 l7 f9 W9 j* ~7 y5 `$ [
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    1 Y5 X1 \: x3 [" N

  2. & w6 n' j+ |9 y4 k
  3. IF @v_ret < 0 : \: @3 ^( R  B" ~: S
  4. BEGIN
    8 c! C. ^0 h3 h& b6 |  p# D$ H
  5. SET @sp_rtn = @v_ret
    5 S5 E2 J/ J1 i
  6. RETURN
    + o: a5 `/ ]; }* C* t1 |& C
  7. END
复制代码
修改为:1 e8 P% ~5 A1 t& L" c! ?4 I
  1. IF (dbo.NameBlock(@character_name) = 1)
    2 n+ i/ l0 W( ~
  2. BEGIN9 v. G9 W" d; Q* T& G/ V
  3. SET @sp_rtn = -12: L5 j! V9 C4 l; o/ k
  4. RETURN
    , L0 L, P* p& E: `. Q5 h
  5. END
复制代码

, B7 z' w: n7 u' O% _3 y/ O" a, c! \3 J8 E9 J, J

. o# i+ k& d% ]' F1 }( c

6 o% m7 G, T1 {; V8 L
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-5-13 20:23 , Processed in 0.036354 second(s), 26 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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