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

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

[复制链接]

154

主题

343

回帖

5868

积分

管理员

积分
5868
金钱
1839
贡献
3532
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
! p, R% |* a) O8 p2 P3 L$ |+ |# L' f* ?, V- f
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
. Z# r% j1 U, F5 r! p8 q
  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 (2 B- C& O/ s2 m% e; d
  2.     @character_name NVARCHAR(40)
    4 J* l! D: Y! Q& Z' J" s
  3. )
    ( b/ K5 |' |3 j3 Z
  4. RETURNS TINYINT3 X0 k( F2 p" q5 X; Q/ H& ^  w
  5. AS3 j. s/ d/ W, ~9 s' a) t8 H
  6. BEGIN; {6 R+ Y; w- l7 P6 D1 v$ t
  7.     DECLARE @result TINYINT = 0;2 `7 X" W' T+ K! c& E
  8.     DECLARE @char NVARCHAR(1);
    " M" g$ l& _, P$ f7 h" B2 r" J
  9.     DECLARE @i INT = 1;% e$ o, o2 m( }
  10.    
    ' i' d: g! B2 _1 i2 S( E
  11.     -- 遍历每个字符,检查是否合法
    # C* R4 S0 V" i( q" K/ A
  12.     WHILE @i <= LEN(@character_name)4 ]* S& p4 Y  {! s8 x
  13.     BEGIN. O+ I7 h( j$ m" }$ ]- T, @/ s2 O1 Y
  14.         SET @char = SUBSTRING(@character_name, @i, 1);: m" @7 G3 r- f6 g. `  g- x& r0 v
  15.         # A& A, e5 t  r  x. J
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号" o( W0 B1 z$ ^
  17.         IF NOT (
    1 o# @& e. b) i, F7 j# m8 N
  18.             -- 中文字符范围 (基本多文种平面)% h7 P* Z1 q  c
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR: ]3 i8 d: l- \
  20.             -- 英文字母和数字8 O5 o/ X+ H4 Y' b
  21.             @char LIKE '[a-zA-Z0-9]' OR& ?& H% c. ^  k: ]- B
  22.             -- 允许的特殊符号# b' H; F) x, Q
  23.             @char LIKE '[_ -]'
    ( z2 Y9 a% I9 e3 c9 o- o; R8 i
  24.         )
    6 d( Y# x6 g7 p' q# _4 v2 G
  25.         BEGIN* Y0 m* P4 ?, I$ f+ a6 I
  26.             SET @result = 1;, l& h/ a* u- j# i; S% w. n
  27.             BREAK;
    2 E# {% ]/ F% x: F: D
  28.         END" v- v3 k# n$ q; z) g
  29.         
    : @+ h: k- o6 @" L
  30.         SET @i = @i + 1;: l  j+ S8 N' t) e, B, W2 Y( x/ |
  31.     END;
    2 {) D* E& n1 O/ ?% s
  32.    
    ) W) v6 f$ o& ^  G
  33.     -- 检查是否在非法名称列表中
    : p& k* {: l4 k5 _
  34.     IF EXISTS (- W+ {/ n) _3 [
  35.         SELECT 1 . N+ X' E3 k- v" _- _- d# ^4 m* i/ I
  36.         FROM dbo.illegal_character_names 5 C5 W. J: o; `! A' _. f( b
  37.         WHERE @character_name LIKE '%' + partial_name + '%'2 D; S+ |  J% O4 X
  38.     )
    ! W& u* a  U: T$ @% i
  39.         SET @result = 1;) D! w; ]2 e5 ]% \/ z9 p! N& H
  40.    
    + `9 u) \( c6 T0 y) j8 ]
  41.     RETURN @result;
    4 n: R. t4 R" C- w1 I( o0 \
  42. END</span>6 h$ t  E* x3 k
复制代码
插入屏蔽的字符6 Q- z# R0 N8 N$ H1 ~2 m5 j; E! M
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    " l( w# R& z  a  y& _
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');* [! Y5 ]. V6 f. b
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');  H/ r, [/ o8 k! b
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');4 Y5 `/ k9 r  ~8 U2 b2 S/ Z" X
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    8 |* U  W+ e9 o! @5 @  m

  6. " `  ~& m, p, J/ E# ~" B
  7. -- 示例:查询包含敏感词的角色名% o- Y/ h5 D8 J2 A3 T! [
  8. SELECT *
    5 @; U0 l) h/ L5 Q2 y
  9. FROM dbo.characters
    1 x; k/ v! u  g: y
  10. WHERE EXISTS (
    4 O6 i" b% w! H5 H( ^
  11.     SELECT 1
    # j, {+ g! o! ?
  12.     FROM dbo.illegal_character_names
    3 G3 b: E& y5 }/ E
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'  o$ I2 c* r, \3 {3 {3 t$ |( ?
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
0 I# N+ J* v$ J2 G1 k原始为:# Z) t" x2 V; W2 L7 L& I- H
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    ) E# @' F$ V2 w) f) i1 q. {1 B

  2. * w' I! A# n& ^1 j
  3. IF @v_ret < 0
    2 m+ c9 @5 q, @6 [2 w6 E6 S
  4. BEGIN
    8 [( c+ u" ~5 _0 ~0 p5 C; {) Y$ [
  5. SET @sp_rtn = @v_ret
    ' x0 Q/ q4 H6 q7 v6 d
  6. RETURN9 L1 U  p. t/ u" ^
  7. END
复制代码
修改为:
0 c; B8 [9 S- R5 P" G
  1. IF (dbo.NameBlock(@character_name) = 1)! T1 ^+ {- D$ S4 J5 n' s6 l
  2. BEGIN/ r5 `5 R0 N# \
  3. SET @sp_rtn = -12
    ) a' ?  Y& ?/ [7 j6 W# \
  4. RETURN0 k  Z& g8 \5 S- F* y2 ?
  5. END
复制代码

9 s# H( J  U% R; r. ]
4 L7 ]' e0 D( ?2 g' d
% ]+ [9 }5 u5 A) H. w9 D2 d

1 w) g& }$ S9 |' d2 I) [  g( h. X
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2025-12-15 21:03 , Processed in 0.068581 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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