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

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

[复制链接]

152

主题

325

回帖

5593

积分

管理员

积分
5593
金钱
1773
贡献
3343
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
: ?" c8 T6 m4 X; D4 S0 z7 J$ M' c# D( S( |
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
( l4 T/ Z% L% z: q2 W1 z, 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 (# |8 W; o* H( m+ Q* `3 v' s
  2.     @character_name NVARCHAR(40)* d4 `, n6 z4 g  S/ w
  3. )
    2 X! _5 F  N- z; ]; c
  4. RETURNS TINYINT
    ! O7 X2 N, @$ C( F
  5. AS3 ^4 s, _1 {1 n* g, K% A; l4 k4 r& G
  6. BEGIN
    6 L. U3 T5 `' h5 A7 i
  7.     DECLARE @result TINYINT = 0;
    3 j# x2 g& ]9 h  q+ Q
  8.     DECLARE @char NVARCHAR(1);8 Y2 G+ n/ \5 e/ c
  9.     DECLARE @i INT = 1;% o( Z6 F& b8 F- N2 {& Y/ `
  10.     0 j& E7 O0 G: m5 i1 v
  11.     -- 遍历每个字符,检查是否合法
    ' l% ]1 U0 P- o% |! V
  12.     WHILE @i <= LEN(@character_name)4 u% s* h& w( u' G
  13.     BEGIN
    & o# S: y( U2 x8 T# f3 R9 @
  14.         SET @char = SUBSTRING(@character_name, @i, 1);, j7 c  l1 V: e7 x8 X
  15.         
    8 ]8 u% H) m- `+ \
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    2 t  [) Z+ D0 u3 ~# t$ G: N0 v0 N4 ~
  17.         IF NOT (
      l2 t9 L$ v& j, p( o5 V' Y
  18.             -- 中文字符范围 (基本多文种平面)- m$ y8 i- Y+ I7 T/ a( P2 ~
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    2 _+ r8 [+ h1 q
  20.             -- 英文字母和数字, a7 w6 H- c% l% B' E5 L, d# Z
  21.             @char LIKE '[a-zA-Z0-9]' OR/ U9 ^0 T& l3 b" e/ x1 ^3 ^5 }
  22.             -- 允许的特殊符号
    ! i0 _2 O/ \9 X  E  @+ P8 c
  23.             @char LIKE '[_ -]'
    7 x  Z2 ^  y$ i" Z+ p
  24.         )
    1 N# Q$ Z, c8 b9 ^7 B. u9 T2 q
  25.         BEGIN
    / T( Y' z3 B* d3 k' D8 \+ g
  26.             SET @result = 1;
      M$ c, R" }0 B
  27.             BREAK;
    " X# K& b3 X9 Q  t( \
  28.         END
    * f( j8 i0 z" l/ u8 U7 u
  29.         - j6 |+ F" ^7 u$ M
  30.         SET @i = @i + 1;
    - y& x4 y6 e0 f9 m$ {7 z  X
  31.     END;8 C& t$ W1 a: B7 i; |" q9 ^$ B( m; p
  32.    
    / F0 |, I% u) z
  33.     -- 检查是否在非法名称列表中
    ; f: x/ n2 q, Y& u4 W+ @7 F
  34.     IF EXISTS (
    ) a- s0 h6 G1 d$ Q2 K" q
  35.         SELECT 1
    2 i0 k* w( r6 G* b# |
  36.         FROM dbo.illegal_character_names " ^5 M' ^9 z2 G; z7 \5 E
  37.         WHERE @character_name LIKE '%' + partial_name + '%'1 M: ]  Q* v% z2 R5 d
  38.     )
    1 [, w+ r6 q$ I+ e- ^2 k
  39.         SET @result = 1;5 k% S% t0 ~1 N; A) n0 @
  40.    
    1 B* }1 G, r" n, R# h- P
  41.     RETURN @result;4 l- R( f1 g+ E8 K- ~8 F
  42. END</span>- y& S# e4 t: P) b
复制代码
插入屏蔽的字符1 k9 n8 Z' l: V
  1. -- 插入非法名称列表(明确列名并使用N前缀). L  D+ T4 d4 @0 q
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');4 i' z6 U) s5 d" T- u  [3 \2 [
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    3 c6 w  c" W4 h  ~. h
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    2 ?& X. {( c' d9 S
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    0 [0 O! }+ c3 }/ d
  6. - T4 u+ |" f& @6 X  t+ z
  7. -- 示例:查询包含敏感词的角色名
    1 u2 Y5 S2 p/ l0 ]) m
  8. SELECT *
    ) p3 E( t9 Y& R; m% J7 K
  9. FROM dbo.characters 7 |/ M2 s8 J9 x4 B5 R
  10. WHERE EXISTS (4 f' b3 M0 v5 i
  11.     SELECT 1
    3 g; S. i% ^/ v/ z) r; C' [) E! F
  12.     FROM dbo.illegal_character_names
    - h6 P5 s) T% v' T
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    ' y9 q6 W  G% I! ?5 d& N! H0 @/ \
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
! x( F) @9 c& e: B6 X原始为:
0 S4 S1 l. c, O$ ?
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    $ ]) T/ V1 y7 L* t; |0 |

  2. # Z, \$ X8 m' p% x
  3. IF @v_ret < 0 3 l  s& a5 {( t: S4 G
  4. BEGIN
    3 s, Y9 n& V" \- g
  5. SET @sp_rtn = @v_ret
    ( Q  S- a% m3 C2 F
  6. RETURN
    - R; Q* z% X' c) ]( _1 A
  7. END
复制代码
修改为:) T; w1 R! i2 B
  1. IF (dbo.NameBlock(@character_name) = 1)
    1 ]0 P: v& G7 f& a# ]; y3 H* _6 q
  2. BEGIN& g8 u& W* a! Z3 @% Y5 h* E! f
  3. SET @sp_rtn = -12
    1 |0 m+ T& S+ [* F- X
  4. RETURN) D2 v  s2 U0 M/ V' u3 n
  5. END
复制代码

: [& y+ O: _5 ^* Y$ @/ k5 \& d9 K' f; n2 K/ e3 D8 z- X% r8 z8 Q
5 W+ t' W1 z; U+ T

0 D& G' ?7 @2 d  }. l
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

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

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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