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

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

[复制链接]

155

主题

348

回帖

6179

积分

管理员

积分
6179
金钱
1868
贡献
3808
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
6 X, C+ h1 k4 t- r& x( F
5 L' S+ H! P. e8 |! Z, B
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
3 Z+ H4 k& u) T" H
  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 (
    ! T7 T" q/ |1 l$ d$ i* T
  2.     @character_name NVARCHAR(40)5 }. S6 m" _# Y
  3. )+ a, x3 A' x/ w! X. J
  4. RETURNS TINYINT
    ) I0 k1 K& f6 `: F5 j
  5. AS( g' ?, R# p4 E( m$ Y
  6. BEGIN  t5 g) Q1 _  m- G: z
  7.     DECLARE @result TINYINT = 0;7 A: M) H  D" o- a0 O
  8.     DECLARE @char NVARCHAR(1);: J8 G2 W! |% m8 W$ I& B
  9.     DECLARE @i INT = 1;' H) j* ]2 r* A- s8 o! Z, r$ j
  10.    
    ; v: X: W. x' u) O" E2 D
  11.     -- 遍历每个字符,检查是否合法& L4 ]: V, C/ t* Q- a5 f; Z
  12.     WHILE @i <= LEN(@character_name)" @  D3 W: B# O
  13.     BEGIN
    ' m- i) X: j. S* q) c6 h4 R
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    , Y+ y! |! n0 h! H
  15.         
    ( }2 c8 _& ?7 ?
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号8 [7 B% g- N9 q+ ^) j
  17.         IF NOT (% m4 `. m5 h! n/ k( B; t$ K
  18.             -- 中文字符范围 (基本多文种平面), [; Z- j+ P: S, o% h
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    ' H  }6 P7 X% T: W  r! z
  20.             -- 英文字母和数字
    ( c; x: V4 c! h, I, R" t
  21.             @char LIKE '[a-zA-Z0-9]' OR
    ) I/ I9 t) m" ^: t2 w' B. m3 O
  22.             -- 允许的特殊符号! I2 ?% F- S# C3 [3 ^
  23.             @char LIKE '[_ -]'
    $ L3 ]# z: B. e
  24.         )5 `. V/ Q  n8 H
  25.         BEGIN
    8 V" O3 ]- J7 r& q8 o5 c# {! y2 F  F
  26.             SET @result = 1;
    9 {4 C0 k2 P- Z0 n; g8 l. Q7 D) X
  27.             BREAK;
    9 c9 T  v, V: D* i
  28.         END" @" @/ x$ q, C) t0 X3 q! l
  29.         
    ; O& M/ x& L9 l$ j' j7 d
  30.         SET @i = @i + 1;/ W6 g# i4 p2 y8 z/ q' s0 V
  31.     END;
    1 }: B; @, R1 w! J  m8 U
  32.    
    ) \, M- v/ {. [' R
  33.     -- 检查是否在非法名称列表中5 k" C! S' ?5 k5 \& i
  34.     IF EXISTS (5 D/ O8 i. ]  p# R0 v
  35.         SELECT 1 # l0 z* y- {: \! N  m2 B) g. I
  36.         FROM dbo.illegal_character_names
    2 N& q; n8 |9 R$ H9 B4 b" L, `& {
  37.         WHERE @character_name LIKE '%' + partial_name + '%'3 v5 I. y% R( g. T
  38.     )
    , E) H3 p/ g, M7 E7 F
  39.         SET @result = 1;
    + F0 X7 p; d; Z
  40.    
    7 T! v% w- T& E2 y1 W
  41.     RETURN @result;: _3 }: Q! A# ~3 l6 i
  42. END</span>
    7 A# @! @. g1 r& k& J0 F1 C4 p
复制代码
插入屏蔽的字符
, m6 |4 T. j# |( g- }1 U+ k
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    " j) h0 k: e$ h/ {- b( v
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    / R2 i/ a8 H1 L# m( Z' Y
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    2 T' y5 L9 d5 a1 [$ ?; [- u
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    0 ^7 V1 [- [6 p8 B0 m$ @' J6 }
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    . ^; i5 r3 n0 g. G8 z+ U; o( G
  6. 3 O$ c" Q6 m/ m9 y2 G, B; X; N
  7. -- 示例:查询包含敏感词的角色名9 a8 ~' \2 d. |1 P$ C
  8. SELECT * 5 v) b4 k, b( C' V  T* f
  9. FROM dbo.characters
    + C; {3 M* V& n: A$ n. {! z6 O
  10. WHERE EXISTS (1 j: {% c" J. x7 x* d+ x/ f* a$ c
  11.     SELECT 1 , x$ M; ?/ u& I0 ^0 L% f- J
  12.     FROM dbo.illegal_character_names
      x1 X, W* ?  ]# |9 T" o! y  f/ U- Q
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%', E# J  B$ A7 \2 T! C4 ?) S
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据3 T& r2 _5 A1 n+ S
原始为:
. Q2 N6 p! `5 a' L6 n
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    : N) d0 z  K# X9 ?" w; @

  2. 1 h* j* U1 j. _2 Q) ~& v
  3. IF @v_ret < 0 7 m& P( g6 b# d- x+ ^
  4. BEGIN& i4 E% [% X3 b( c9 _. P+ A
  5. SET @sp_rtn = @v_ret
    * n1 j9 `- h' G7 ?" c
  6. RETURN
      {1 I6 ^+ [' b+ B- C  E
  7. END
复制代码
修改为:  o; {$ {- z( l! O6 i
  1. IF (dbo.NameBlock(@character_name) = 1)
    7 B1 b6 y0 g2 O! R' M8 s4 \: r7 F" |
  2. BEGIN7 u0 d: x. f/ Z  V" i
  3. SET @sp_rtn = -12
    ( }+ Q& k/ Q3 A+ E- {
  4. RETURN
    . l& P* h( h. f! J% m, G
  5. END
复制代码

9 ^% J: I4 b6 b$ `% |: y3 }% c
0 T) h7 z4 s7 O, M
) E0 p) j; T! b

  d3 e, ?: u# o- `3 p  L0 b2 b
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-1-2 00:07 , Processed in 0.296019 second(s), 24 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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