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

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

[复制链接]

150

主题

299

回帖

5277

积分

管理员

积分
5277
金钱
1689
贡献
3139
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
1 h! N  l1 l/ t9 K; ]6 i2 @4 l; w, q. n9 o# T
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数3 \: e5 ?8 J5 S9 E( }8 r
  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 (" v9 S+ h) k& @. ]: H# G7 o
  2.     @character_name NVARCHAR(40)5 Z- `) y) |. H1 a9 T- _' o
  3. )
      R4 ~! U; m: R& C6 ~7 Z
  4. RETURNS TINYINT7 X( D' M6 s; P4 N$ P
  5. AS
    : W5 }7 U5 A8 E6 u/ B# r
  6. BEGIN, I; l9 a' O+ R' c) F+ I2 ^
  7.     DECLARE @result TINYINT = 0;) i8 D5 Z& m3 g( X# X
  8.     DECLARE @char NVARCHAR(1);, [6 Q# o1 a% ?
  9.     DECLARE @i INT = 1;  G7 C5 v0 W' j- R+ c
  10.    
    ( y, `8 G1 `* E% Z6 y1 a+ u7 B- C
  11.     -- 遍历每个字符,检查是否合法9 z/ E- R- \, l5 ~% Z& M4 O  _
  12.     WHILE @i <= LEN(@character_name)7 Q- \) s3 ^. ]* M
  13.     BEGIN% Z0 L# Z; @( g$ U' S' _! p
  14.         SET @char = SUBSTRING(@character_name, @i, 1);7 s$ u6 P8 q& M1 b" p
  15.         
    , a3 W, E. I2 r& r- T# J
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    & W% l+ ?9 o$ |7 d1 T% r
  17.         IF NOT (
    5 P6 o7 K  f) p' J' d4 L" e5 ^
  18.             -- 中文字符范围 (基本多文种平面)
    3 i  c/ p  h# ^) i7 d- l
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    9 a  ^$ o+ D) \7 K
  20.             -- 英文字母和数字8 N5 [$ p5 j/ k& `. o; W
  21.             @char LIKE '[a-zA-Z0-9]' OR
    4 A' O- H# ~$ a2 R& _) V7 x1 Y* N" F
  22.             -- 允许的特殊符号
    ! L" M; R4 X) G) |1 [3 T8 K* m
  23.             @char LIKE '[_ -]'4 ]3 b, I) R1 u. [7 d$ p( B
  24.         )
    ) c' X1 {9 F( v0 h! y1 H/ x
  25.         BEGIN
    2 y7 P( C& S8 L3 M
  26.             SET @result = 1;
    3 ?! L/ H9 F" z4 N3 R" \
  27.             BREAK;
    2 c! s8 x7 u0 ~! L/ O
  28.         END
    ' p. B# I' R3 Z2 P1 n- B
  29.         5 }! X; L* e6 d8 }5 Q; ~
  30.         SET @i = @i + 1;* g1 ^+ T. V9 o! _9 Y  o9 [( @
  31.     END;
    9 P/ C  k$ _! F  G( j
  32.     1 g, X4 f" M, `4 h. U8 h
  33.     -- 检查是否在非法名称列表中
    ; Z! ~* K1 L' E- n' S5 R5 z; ]& D$ L
  34.     IF EXISTS (
    & ~+ M# ~7 X: V8 n2 p
  35.         SELECT 1 8 ^6 |7 }/ E" G* e
  36.         FROM dbo.illegal_character_names
    ' }. I1 G7 @% {4 @
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    8 d( P6 D( h- _4 p# S4 a( i+ v
  38.     )
    / l; }: Q; _' R2 |" K8 y' h$ Q
  39.         SET @result = 1;# O2 d+ U$ C+ j' E8 \. q3 s
  40.    
    6 Z' p7 [5 N, z. Q2 @
  41.     RETURN @result;" w$ `$ J  S$ S
  42. END</span>1 L4 |0 B# y1 r' F5 L
复制代码
插入屏蔽的字符
) a3 V( s4 m6 m) E- V( ~$ E
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    1 {% B+ k* N2 w0 ~" E; S
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    0 e1 Y( ^% A8 z2 v0 n& I
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    % S7 u. w5 F# t7 Q3 o1 x
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');! y! O* i4 P% H, I8 I; d' u8 x
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');8 ?4 N9 t; a; Z3 o6 i
  6. $ h& I3 [5 C1 ~# u% \
  7. -- 示例:查询包含敏感词的角色名
    - X; u' c7 E, e
  8. SELECT *
    3 r7 N. r# v8 W  _) J
  9. FROM dbo.characters - y, v7 M- Y- q1 _& @
  10. WHERE EXISTS (
    3 V$ A. k* l. \  B0 u" B% ~: O
  11.     SELECT 1
    - F  U; u' L) }2 F! ?0 A
  12.     FROM dbo.illegal_character_names
    - {- V+ Q% E! y! N
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    ' N% D: z- m. E$ y, r
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据4 C% u# \2 p$ _/ X' |" S
原始为:
: q6 y2 a0 b  I& y0 w$ g' g) k0 _
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    # L4 ~6 ~) p  v. Z, U- b# Y

  2. 5 n4 K' ~6 o- u3 G) |1 D$ {, m
  3. IF @v_ret < 0 5 f6 ]6 X5 E) y, c; S: {' Z/ {
  4. BEGIN4 y% ^! L7 k& N2 ~
  5. SET @sp_rtn = @v_ret2 J) j4 o* a+ Z
  6. RETURN
    . l3 G+ ?- q! [/ }. t9 B$ w& C) p
  7. END
复制代码
修改为:- t  U; S' O/ s0 C6 |" w( e- n
  1. IF (dbo.NameBlock(@character_name) = 1)
      Y+ m, T7 e9 O" m- U
  2. BEGIN
    2 z' L+ H* C( n! X0 J  \, w$ Y
  3. SET @sp_rtn = -12
    3 U/ h5 c( i0 s- F/ G: H
  4. RETURN  E8 `# S2 K- |+ c8 K1 V
  5. END
复制代码
. V; |1 `: Y' U

! ^% g# z0 P% l% b, U; E: h
/ p& @$ B7 _; j% `. _& z7 t

! d/ T8 \- D/ X# Q
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2025-10-3 09:44 , Processed in 0.047315 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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