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

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

[复制链接]

147

主题

281

回帖

5144

积分

管理员

积分
5144
金钱
1639
贡献
3077
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表. b( a) F2 L; S! ?# i7 q
# p0 \, f2 {+ c: L1 X
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数2 v0 D- n' `* S. B
  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 (
    ; [9 W$ W* h* i
  2.     @character_name NVARCHAR(40)6 E1 \9 G  A+ ?' G3 J3 H
  3. )8 H( i: b( Z) R! O- |
  4. RETURNS TINYINT4 I: s3 s" X8 u% O) j, }' O0 b1 u( f
  5. AS* ~( M/ b4 J$ e3 A
  6. BEGIN
    ' r& H! n$ O* R) i
  7.     DECLARE @result TINYINT = 0;9 g; H) O  Q. W' K+ \4 B& e
  8.     DECLARE @char NVARCHAR(1);) b4 O3 b0 A/ ]3 i" N0 R; A4 k
  9.     DECLARE @i INT = 1;
    8 C1 u! l# x$ r7 G; m
  10.    
    , z7 ]- _0 Q% N3 u/ W5 _
  11.     -- 遍历每个字符,检查是否合法7 e+ o' g3 b; S4 \) j0 r5 M% e
  12.     WHILE @i <= LEN(@character_name)% o# O# M4 b! ?( s$ v6 Z
  13.     BEGIN
    8 V& j( B- Y; p1 A& r! u+ u: |
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    0 M/ s6 K2 y. u6 N
  15.         
    * i) M3 G1 b3 a  v' @; G5 E% W$ W
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号) T( J/ {& W: K& ?0 c* k
  17.         IF NOT (
    3 Y+ Y8 F- _5 G! u$ Q
  18.             -- 中文字符范围 (基本多文种平面), l, P8 O; H9 s4 e4 `" t
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    7 O+ a6 b/ a. |0 Z
  20.             -- 英文字母和数字  n5 O, l5 {# y& C* V6 v& I5 {% i% F
  21.             @char LIKE '[a-zA-Z0-9]' OR
    5 F$ X* k6 f# p: N% m  S5 w
  22.             -- 允许的特殊符号1 R$ ]2 q( j9 K2 f
  23.             @char LIKE '[_ -]'$ U4 X. L0 Q. _+ |# A
  24.         )
    # k- X" r% ?) X6 X/ n) ]/ @
  25.         BEGIN0 l" r% F  n4 f( _6 z5 j/ h" C
  26.             SET @result = 1;% J9 Z% Q1 `' V# b
  27.             BREAK;9 z; x8 @5 R0 P6 w! m
  28.         END
    4 f/ z. Q( n# T7 L) t% s4 M& w( Y
  29.         : X2 w6 }) l6 m" E' y' f
  30.         SET @i = @i + 1;
    + q3 B" X) R/ V' _; O
  31.     END;0 L. k9 K- [1 Y* V7 J
  32.    
    6 c# T1 I; M5 Y" t: h) L" l
  33.     -- 检查是否在非法名称列表中
    5 {% I7 Z2 |. b: |, G
  34.     IF EXISTS (, m/ I1 v) r1 \* m2 ]* a
  35.         SELECT 1 $ d, T9 j$ k* t- T% Y
  36.         FROM dbo.illegal_character_names
    5 [8 m" W6 [7 D" N4 c6 {& G& N
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    / l9 n$ ~/ m0 v; a8 G
  38.     )
    . }$ j7 s* ~$ x6 \  L2 `. M
  39.         SET @result = 1;% \$ [5 Q$ b0 y
  40.    
    1 v$ n0 ^$ r0 B) _- L
  41.     RETURN @result;
    % \$ V2 r/ m* U( y
  42. END</span>
    . A. n& G& a6 i* i
复制代码
插入屏蔽的字符
, \; d6 ^4 T7 U
  1. -- 插入非法名称列表(明确列名并使用N前缀)5 n! A7 ^) r) I; y# c
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    ! [6 |! V0 [1 Z# H1 K
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    * }, h. \6 e0 m3 H3 q3 P1 k
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    + ~, p3 |# [4 W. b! V
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    # J5 v, G  J9 C/ q/ ^& h
  6. - _; F8 A" f( M
  7. -- 示例:查询包含敏感词的角色名8 U# H* @4 Q! B5 p
  8. SELECT * 5 x, f. ]( O' R
  9. FROM dbo.characters
    4 a7 s/ Y" a0 K
  10. WHERE EXISTS (7 r1 U" H) O2 J2 p# Y
  11.     SELECT 1
    , M" P% e2 n; `, e" _
  12.     FROM dbo.illegal_character_names 3 }& `4 g; ~6 |
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    . O% H9 D* Y- A& U" o" Q' @+ V, K
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
* Z; a: J" P5 I原始为:
; M' e, F6 t" O/ }, m7 p# Y0 K' b
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT& o% ]) T' E" M$ y0 M

  2. 4 N# O& U5 ~* ~- l
  3. IF @v_ret < 0 / O5 V1 ^& I; H% e  u
  4. BEGIN' k' Z" Y# b# r" N
  5. SET @sp_rtn = @v_ret
    7 L/ j" ]6 v8 E) j3 }+ L
  6. RETURN9 M" F5 ~1 t3 n! s& m
  7. END
复制代码
修改为:. E, C8 h. `4 e1 J+ ?" {7 ^
  1. IF (dbo.NameBlock(@character_name) = 1)
    # S- h2 ?+ Q6 b# D
  2. BEGIN
    / S# g  W" }( {! _& y
  3. SET @sp_rtn = -12+ c5 J( S8 X- g! f4 [# Y# E9 _
  4. RETURN
    3 F1 S, \/ b' }  j+ V8 @
  5. END
复制代码
; A& g* W! |8 [7 U0 M; j
5 [$ t. O5 h) a& `1 k4 @
: g0 O: O  Z- h- J  ~! T
) d* h+ y% Z3 v" ~: q0 y  m
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|手机版|小黑屋|EGameol

GMT+8, 2025-9-14 07:00 , Processed in 0.040482 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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