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

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

[复制链接]

147

主题

281

回帖

5125

积分

管理员

积分
5125
金钱
1637
贡献
3060
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
; V; V; t7 I2 G1 ^) Q+ c. X& Z7 ], b
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数1 c  Y1 j! W' B2 p: j# 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 (
    3 q0 W4 C. B4 ?; Y) Y% m
  2.     @character_name NVARCHAR(40)/ z7 [0 g' K8 d( |& D, S
  3. )4 [$ D" E6 P* |# y/ o
  4. RETURNS TINYINT
    : o$ ]. k2 L+ S/ W8 T0 L- d- O
  5. AS2 R. u2 G, x" v
  6. BEGIN' E6 Y8 {+ `8 y. U/ q7 ?; a$ R' D& @
  7.     DECLARE @result TINYINT = 0;' u" S: C1 Z$ M/ t$ x0 j* Z
  8.     DECLARE @char NVARCHAR(1);
    2 O' E: g( d8 i7 s
  9.     DECLARE @i INT = 1;
    & y" z8 f" v  u3 M
  10.    
    ) o' X: \! u2 ]
  11.     -- 遍历每个字符,检查是否合法
    ( y% @" T& u  {2 O; l
  12.     WHILE @i <= LEN(@character_name)- \7 W5 r4 w  ]# x- S! J9 _
  13.     BEGIN) R; E2 {8 K8 j/ G3 ?
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    9 l! Z8 l7 u& b( u: R) N( W
  15.         
    ' D! z; F6 Z3 m# U$ S
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    2 C8 C, w2 [4 w0 @
  17.         IF NOT (/ Q5 w6 d  `9 `( ~
  18.             -- 中文字符范围 (基本多文种平面), F, C" Z/ I% ^0 P
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR3 n2 _/ r5 a3 S! w- w( l4 _2 w
  20.             -- 英文字母和数字6 H) @% z# g5 q- B9 a2 B+ a
  21.             @char LIKE '[a-zA-Z0-9]' OR) t! t' o; |; V( s9 k/ F
  22.             -- 允许的特殊符号
    , s% K1 ?/ _- Y, \9 ~4 Y, w
  23.             @char LIKE '[_ -]'
      r& e7 X4 ?, ~. ?+ O0 B: n% m" \
  24.         )" S9 ~  [6 y& G; Y6 W
  25.         BEGIN  V% r8 @4 v2 Q8 N4 N) A  l
  26.             SET @result = 1;1 M" K/ N, k" C! j% K3 w8 e# C
  27.             BREAK;
    0 D' R2 c* B4 v
  28.         END
      ^& k" I  M( Z5 @, F3 N
  29.         
    ! M+ @2 h- N5 B' s
  30.         SET @i = @i + 1;: b1 }; [' {9 A% I
  31.     END;
    4 T) L* Q4 \0 i7 o5 D
  32.    
    " x* r" p3 s' o9 l' Z5 M
  33.     -- 检查是否在非法名称列表中
    0 g% _+ R. x. s: @; U( e2 ^
  34.     IF EXISTS (
    + q4 H# X% k. j6 m- S0 @4 d3 V
  35.         SELECT 1
    4 |1 Z3 Q" n  E: N; o- P( B
  36.         FROM dbo.illegal_character_names % n( D; [% B/ [. R& Y5 M! k
  37.         WHERE @character_name LIKE '%' + partial_name + '%'5 s3 w) s, F; q% ~8 d4 q
  38.     )8 p& k" {5 S; F
  39.         SET @result = 1;
    % D. Y- O* d+ @/ a/ L, R/ z
  40.    
    4 {' ]6 r7 g7 z, z# L
  41.     RETURN @result;$ q. r# T" C4 g8 ?* ]. E: z8 h  t
  42. END</span>
    0 N6 V0 P3 q6 V9 T, L+ t6 n
复制代码
插入屏蔽的字符
' t# l. a1 ~: ^3 d
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    ! x/ `+ M  D2 O. w! }% s
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    6 |5 S1 ~& U" x  z$ r9 z  g
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    3 g4 y5 R$ d  [" S
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');& P* G  z$ i; r! @. E
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');8 r: K. p$ q& a) J
  6. , U3 o: u5 q, ~" J5 \8 ?7 T
  7. -- 示例:查询包含敏感词的角色名, Z$ \: o; O5 h( |# {" s- O
  8. SELECT * : ~* B( v) Z- M8 m9 H' O
  9. FROM dbo.characters
    4 Z; g  f& I, O6 k
  10. WHERE EXISTS (
    7 U$ Y; P2 K' x% S' U" Y
  11.     SELECT 1
    ' O! Q! q  `5 U" I) G4 Z% k
  12.     FROM dbo.illegal_character_names
    0 b# [! c$ O! ?8 L
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'  |( K9 `: v+ I0 j' o" e) d! z
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据$ d; I$ j2 h: b+ ~$ p5 m
原始为:5 ?7 R- K, e+ ]
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    ( [. V1 S9 [' P" m+ t9 x4 Q0 i9 m
  2. ' t4 M. w  C! j
  3. IF @v_ret < 0
    ! X. T) v! M7 f- c# `/ R" Q
  4. BEGIN5 h9 i+ j) R6 g4 g# I& N2 S
  5. SET @sp_rtn = @v_ret
    4 ^$ W. Y* C6 `2 \& t
  6. RETURN: S# L* G0 i: q3 I7 n9 j5 M
  7. END
复制代码
修改为:
% J; |2 G* t) P& N0 Z
  1. IF (dbo.NameBlock(@character_name) = 1)
    5 o5 |( j& J, n0 Y3 q) x. U; O
  2. BEGIN& J( g0 Z; M  ~! M6 T+ l* M
  3. SET @sp_rtn = -12
      r& n( K/ o" C; r: A1 N
  4. RETURN
    / h% Z$ ^' e! y2 w( a8 z6 M4 p; u( `
  5. END
复制代码
5 q2 a" J0 F$ C' I9 k

; R1 M/ a9 B( N: _0 e* h7 H/ ^6 x
: T/ L; U! k% Y1 t" ]) n3 H" O

7 X& i$ [' V, Y
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|手机版|小黑屋|EGameol

GMT+8, 2025-9-11 22:01 , Processed in 0.037748 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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