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

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

[复制链接]

164

主题

407

回帖

7723

积分

管理员

积分
7723
金钱
2247
贡献
4905
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表" }; w. J/ Q0 I3 y6 C

. \8 k. h* I9 F- ]; `9 E) e8 t
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
# ?! o$ r, t3 a* c- {% f* }( Z
  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 J# Q1 ?' M) f+ k3 b0 V
  2.     @character_name NVARCHAR(40)9 o3 A2 `: C% Z5 J5 y8 v( \, \
  3. )& E5 S% i( n! M  }
  4. RETURNS TINYINT
    7 T6 R- s( M  u7 p3 a) |
  5. AS
    & y4 L2 N9 F1 w. C0 h
  6. BEGIN7 G+ N. P; p+ R+ y
  7.     DECLARE @result TINYINT = 0;$ \6 d2 }1 S: r! ^7 }
  8.     DECLARE @char NVARCHAR(1);2 d, A2 t- X+ ^
  9.     DECLARE @i INT = 1;; F0 t( @8 r- I& C
  10.    
    , t1 H  a" U$ y3 h3 G
  11.     -- 遍历每个字符,检查是否合法& W* s4 G. A2 p& R0 O
  12.     WHILE @i <= LEN(@character_name)2 `% w3 T" ^) ~* g$ P
  13.     BEGIN- R* b3 M" d5 C" f! O& }
  14.         SET @char = SUBSTRING(@character_name, @i, 1);3 V6 L  R- q6 W! U3 i1 R- N
  15.         / a6 {5 Y5 P0 Q* H% v9 d& H: D9 F
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    & j, u( U, K  U
  17.         IF NOT (% j' e, ?% v/ B
  18.             -- 中文字符范围 (基本多文种平面)
    % j' X! _; s, W# `, H+ ]+ l
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR: H9 H: N) s/ w6 g9 ~  o. p% H- v
  20.             -- 英文字母和数字* E$ a2 e7 D/ b1 p, m2 A! r
  21.             @char LIKE '[a-zA-Z0-9]' OR
    $ `/ m) Y' t; _! m( G  p- k
  22.             -- 允许的特殊符号
    ) R, B; }' V3 ?2 A+ I* p/ @
  23.             @char LIKE '[_ -]'9 |4 B. F& _0 q* o
  24.         ): N; L2 d; U' T! @! _+ |
  25.         BEGIN0 U, F+ W% q6 ^  C% }, m
  26.             SET @result = 1;
    1 I: R$ {* D5 E6 o- K: A. E& G
  27.             BREAK;, v+ ]- h6 P( o
  28.         END/ z9 @! {- ~5 O) T$ |
  29.         7 Q3 D2 y. y  _! Y/ ~5 d
  30.         SET @i = @i + 1;9 O/ U* }& N# B! Q6 C& j2 \+ A
  31.     END;3 ]& s) d0 A. o7 I4 e3 v7 _, x3 w
  32.     4 }( ^6 [5 W/ B/ }+ \! T- X5 O
  33.     -- 检查是否在非法名称列表中
    ; H0 m5 L, B% S7 b$ d
  34.     IF EXISTS (
    . ~3 T) g; M8 y/ r6 }* q. S% b
  35.         SELECT 1   _* ]6 ~1 u8 k7 N* |2 A; _
  36.         FROM dbo.illegal_character_names
    ( T0 d8 [( m$ S+ ]- ?1 _0 S1 F4 G
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    , G9 X2 w8 p* u, c( b* s
  38.     )
    3 F0 E/ i" M# g
  39.         SET @result = 1;
    8 J9 r/ w/ @$ j7 k' y! k$ \. m  A: k
  40.    
    7 g9 {$ }; `% N( |1 A" a
  41.     RETURN @result;
    4 I6 f8 d9 }8 N3 S
  42. END</span>  r: R1 n/ }! s/ y
复制代码
插入屏蔽的字符
; Y+ A3 _% S  h8 l
  1. -- 插入非法名称列表(明确列名并使用N前缀)9 h7 r* I9 e" k1 _8 ^
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');2 m  q2 ?! [8 u8 k; T
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    8 v1 N$ w% K2 c# U
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    # a, L3 X  d" m& T+ y! V+ r7 O
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');" p9 H9 E+ y3 J

  6. , T) w, D2 S6 W2 V+ ?
  7. -- 示例:查询包含敏感词的角色名
    ( L! b8 F% i( H: b6 x0 u; A4 s
  8. SELECT * 1 |8 M1 ^) {& c- b. l+ H* R
  9. FROM dbo.characters
    , o& t& G, r& k1 v' d. w
  10. WHERE EXISTS (0 _7 v3 x) k! }6 [4 @# h/ b
  11.     SELECT 1 6 u3 s& q4 O& S
  12.     FROM dbo.illegal_character_names 0 [6 ?& G: J" `9 N; G
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'% _$ N& ?/ ?* n. l
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
" u' X* |" B' d  a% O0 Q2 h$ y原始为:9 Y; Z: M% \( p2 k0 h3 S
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    5 Y% G0 g! O  M0 F% d
  2. 6 |7 E) T7 M9 r# B- p1 [  M5 l
  3. IF @v_ret < 0
    3 I7 K; O- }! F, c. i4 O
  4. BEGIN
    . b+ e  d0 y  a
  5. SET @sp_rtn = @v_ret
    0 Q" c/ u7 J6 V
  6. RETURN
    # ?( H9 K8 u4 n! f0 M: e# L
  7. END
复制代码
修改为:
8 ]; y& J) ?$ K& A9 Z
  1. IF (dbo.NameBlock(@character_name) = 1). Y5 N5 v0 j: U# E( N
  2. BEGIN3 b3 t1 [1 g6 a) {6 @
  3. SET @sp_rtn = -12
    0 z  C( u6 d( j! }5 S" U7 Z5 L& ]; U
  4. RETURN
    + j# W1 |& ?; u
  5. END
复制代码
9 E% m2 D+ ?' N$ ~! A- \
/ j  z9 Y6 L5 N6 P4 Y& h

: `! ~- }; C" D
- u' ]7 U  z9 ~' q. K1 T- d
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-6-23 06:47 , Processed in 0.028568 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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