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

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

[复制链接]

157

主题

362

回帖

6846

积分

管理员

积分
6846
金钱
1946
贡献
4381
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
: @. C1 q6 |: N3 f! o5 T1 U9 d2 W% E2 C. B+ ]' F* t. b
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
$ i2 m! H0 o! a& X) k/ O/ R( u
  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 (
    8 y+ N0 A# i% N4 H
  2.     @character_name NVARCHAR(40)
    ! i9 D) ]: C2 R0 u7 ~  c; A
  3. ). N1 b" J8 |" n) Q. V5 h& t
  4. RETURNS TINYINT
    ' F/ ~* T) l; k- t$ j+ c
  5. AS$ e( @6 |3 U+ T* N! w: H7 [. W
  6. BEGIN
    7 z2 f* b8 D7 p6 e
  7.     DECLARE @result TINYINT = 0;2 C+ G# n/ o: w) C/ b4 C" q+ _( }
  8.     DECLARE @char NVARCHAR(1);, U& }! J( x8 u7 q% ~# l
  9.     DECLARE @i INT = 1;- E2 U* x) b2 e" D/ h
  10.    
    ! F' N* F5 |5 ]% \4 C2 w
  11.     -- 遍历每个字符,检查是否合法# S7 ?- d* ~( M/ ]+ T* m+ m
  12.     WHILE @i <= LEN(@character_name)
    3 s% R4 L" _5 H
  13.     BEGIN
    5 c+ ~# Y6 ?) c/ g
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    ( I& ]2 E+ s- y1 u0 R
  15.         
    . r- _8 |& k2 Q- V2 K
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    , X5 d. Y* H) f1 O- H* C) `0 p2 m
  17.         IF NOT (
    ! z6 ]% U4 K0 U! F
  18.             -- 中文字符范围 (基本多文种平面)
    # \" L1 w, X1 O8 M: J
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR* n4 h5 c3 o! S6 C! t
  20.             -- 英文字母和数字# e4 f/ N$ {9 `# R
  21.             @char LIKE '[a-zA-Z0-9]' OR
    ; k( N5 l7 p  y
  22.             -- 允许的特殊符号
    4 ~& z% h# [: u% U% {% s
  23.             @char LIKE '[_ -]'
    ' D  c7 {2 n" w2 v! q# @
  24.         )
    ' s( ?& j: U% v( _( Y1 R
  25.         BEGIN2 j: C7 a$ L! G. O
  26.             SET @result = 1;. s4 C, W3 M9 q: Y5 s5 p9 z
  27.             BREAK;
    2 v9 c6 E# u7 a
  28.         END
    6 U1 f4 e8 ?& B( f  W6 E
  29.         6 T3 M0 @% M3 e: F! m' H2 c* P; q
  30.         SET @i = @i + 1;
    , k4 X$ _  C: x$ h( {
  31.     END;
    & b* s& N3 C7 a' m6 i; B; N  B
  32.    
    : x' [7 v* m/ f) R' Y- z
  33.     -- 检查是否在非法名称列表中- i0 `, }# d* W  j0 i
  34.     IF EXISTS (
    9 j, a  g+ s( F7 E
  35.         SELECT 1
    ! d: s8 C& ^4 q0 ~
  36.         FROM dbo.illegal_character_names 5 x; R( }: U6 J# Y1 h; g/ v, ~  ]
  37.         WHERE @character_name LIKE '%' + partial_name + '%'- |# d' i! H4 U, Y# g6 F1 Z$ k' T- \- ]
  38.     )
    0 K0 ^" v* Z2 F% o
  39.         SET @result = 1;; D# x/ z; k* c+ c5 C
  40.     & {5 E7 Y2 r; o! Z' R- d! c
  41.     RETURN @result;& I" k4 B: V9 B3 W! C
  42. END</span>7 ?" A3 G. ^6 A1 O; F, K
复制代码
插入屏蔽的字符
+ N# D+ \% c) D8 [2 |" L
  1. -- 插入非法名称列表(明确列名并使用N前缀); Y( e7 [9 C1 s3 L2 Y6 H6 ^
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');9 @8 A+ O8 a$ g# I% ^# u
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');# e& d, W6 k  v8 [9 s4 ?, q7 \( k
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');6 @  F9 ~8 X$ x$ m' ?; s
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    ; H, @: Q* ^: A% E  c) S
  6. ) y$ b( I6 }) y
  7. -- 示例:查询包含敏感词的角色名
    & p4 }1 L' O. l" H2 Y
  8. SELECT *
    / f  A7 D6 \3 W5 X. }1 ^6 K
  9. FROM dbo.characters 2 M- c0 Q* q' D+ n
  10. WHERE EXISTS (: n, H" |, \; p- x4 h  z. @
  11.     SELECT 1
    8 i- I4 ~+ A. U, a4 ]" X5 C
  12.     FROM dbo.illegal_character_names # k% P' ~$ _5 `9 P8 e
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'1 L  i3 P* [" S, F
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
. M& l* C* C9 n$ G7 R9 W& l" B原始为:- V% ?9 C# U8 v$ h/ Z
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT. ?1 _; O/ X7 v1 G# R% F/ G
  2. . x, j/ i3 a& ^* I" s% K
  3. IF @v_ret < 0 1 ~9 K1 p) a& Z5 s5 T! l' I) `
  4. BEGIN
    1 J9 L& h3 M7 P8 H
  5. SET @sp_rtn = @v_ret$ ^: H; F1 K% A* n
  6. RETURN7 _" `& f- F0 |* `
  7. END
复制代码
修改为:6 V/ W" o1 |( O
  1. IF (dbo.NameBlock(@character_name) = 1)
    0 u; O3 k+ A- U. P( W4 \
  2. BEGIN
    7 o2 d* X, w2 V
  3. SET @sp_rtn = -12% K5 A' y) K. m, D
  4. RETURN5 u' f3 I1 q" _( G$ l
  5. END
复制代码

' A2 x, t9 I4 G! F. w( J9 U' l$ @2 _+ Q7 |

0 M3 ~- ^: `& t9 w5 \/ _  t
/ x+ g: v* I. P6 m& @4 r
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-2-19 11:28 , Processed in 0.054984 second(s), 26 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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