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

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

[复制链接]

152

主题

325

回帖

5593

积分

管理员

积分
5593
金钱
1773
贡献
3343
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表# [  c. C8 X: r+ c
$ b2 v% t5 J; @% T2 p3 c
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
; Z' f+ {0 S: T6 P" d
  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 (' _+ S9 G9 {  G0 U6 X
  2.     @character_name NVARCHAR(40)
    - w1 q1 o: A( E: M
  3. )
    & z& \2 j$ N3 H& B
  4. RETURNS TINYINT
    + X1 i( u4 L7 L
  5. AS' `5 E/ |' i" g2 F/ x, M7 o% n
  6. BEGIN" ^8 `" z" O9 p$ ~# \- w1 _
  7.     DECLARE @result TINYINT = 0;- y1 G: D8 z2 l
  8.     DECLARE @char NVARCHAR(1);! w! J) x0 B) b# Z8 F' \; _6 ^
  9.     DECLARE @i INT = 1;# I3 F; c- q8 n
  10.    
    8 p5 l0 K% G0 ~5 ^" p* g! Y
  11.     -- 遍历每个字符,检查是否合法
    5 e0 }- T! ?2 e8 o. P" T
  12.     WHILE @i <= LEN(@character_name)! D& `) ], Y- l) G4 P3 B5 J1 C+ e
  13.     BEGIN
    5 }  w/ R2 k% m. o3 o
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    ( m  b% T. ?* ^: w
  15.         
    0 `  h" A) ~/ d  d
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号# K2 f" }! M' w8 z, Q
  17.         IF NOT (# k4 x+ ]! `; J+ Y, X% t( [9 w5 h
  18.             -- 中文字符范围 (基本多文种平面)5 g6 W" [! L" b6 V7 Y. s# J
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    & G8 R$ n- u- d/ J: N) D% U  c2 C
  20.             -- 英文字母和数字- y2 O2 o+ e6 H- }& \; ~( G
  21.             @char LIKE '[a-zA-Z0-9]' OR: u* P+ k1 }& U/ D$ h6 M4 y/ }, h
  22.             -- 允许的特殊符号+ x' y/ h0 }& j
  23.             @char LIKE '[_ -]'
    " a* j& t4 |* }4 o, G5 r2 I7 l
  24.         )
    $ X9 B; i* B: M4 y+ b
  25.         BEGIN% j2 ?6 v- Q  U
  26.             SET @result = 1;
    ! L3 g( Z# L3 M$ ?" z' x. x0 @9 h
  27.             BREAK;, M: o( l2 q0 B; B1 c0 }1 U/ R
  28.         END
    ! U5 l- f, H) q3 Z
  29.         
      G. K: e* k9 P. S! C4 h
  30.         SET @i = @i + 1;" K  \/ ^1 J3 C
  31.     END;
    $ m% @& x( ~; Z; K7 N8 m/ w- `
  32.    
    , R0 N0 O# d- o6 [8 ^' |+ e- ^  S0 `
  33.     -- 检查是否在非法名称列表中( G2 r6 t) p# S- z+ U( {! a7 b; J) N
  34.     IF EXISTS (
    7 [1 a5 J0 E8 }/ N9 F2 m+ j9 |0 a/ i
  35.         SELECT 1 % `7 n8 z* ~2 n- {& w
  36.         FROM dbo.illegal_character_names
    6 V4 y5 o$ Q9 F/ H6 {
  37.         WHERE @character_name LIKE '%' + partial_name + '%'! \( H1 E* G+ x7 f0 {7 c
  38.     )
    " m+ n) G( f, \; Z1 T6 F3 b" O
  39.         SET @result = 1;
    ; g5 r9 z/ V* ^! y
  40.    
    2 @" N1 F; V: t
  41.     RETURN @result;) L  S2 R6 Y7 J2 E) N
  42. END</span>9 b+ Z: z7 x' K* z. X+ w7 x9 O* ^
复制代码
插入屏蔽的字符, n' X6 O- q% [3 y/ U* f  O
  1. -- 插入非法名称列表(明确列名并使用N前缀)9 H8 w# X% V" o) R
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');3 v9 `4 R( l) O  f
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    6 f+ A  X3 y' a, s- A7 T7 Q
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');4 T+ m" p2 j7 Y5 m; n' {
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    - y& i1 C' S: e/ I5 n1 z) v9 T# Q
  6. 2 ?. l# w& f  q. U  m
  7. -- 示例:查询包含敏感词的角色名
    ' ^5 x# i8 F* E. b% Q
  8. SELECT * : h) k: ]& _6 D2 D$ N! _4 Z4 y& q
  9. FROM dbo.characters 7 i3 t; x4 H) X% x) h9 e
  10. WHERE EXISTS (
    ) D, t- \* U0 e6 Q
  11.     SELECT 1
    . ^) a3 v& q: U0 H- `1 j8 ^
  12.     FROM dbo.illegal_character_names
    0 o" k' \4 n, w3 X' |
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
      i' N6 u( y2 V8 u8 t# W
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
; b8 L1 O9 a( |* y原始为:( d' F7 q: N9 [! K
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT+ o) }- W" N# M8 w

  2. ! B+ I, n# y+ A: @# Y$ G
  3. IF @v_ret < 0
    . m- V+ u* l3 F9 _7 s
  4. BEGIN6 U! ~& p: S, d+ I
  5. SET @sp_rtn = @v_ret
    2 I: `2 `- E% |" W4 v3 B! v
  6. RETURN1 ?' C+ O; l$ A7 X4 g+ ]3 E% j
  7. END
复制代码
修改为:! [1 ^0 m$ ~) C3 k
  1. IF (dbo.NameBlock(@character_name) = 1)$ Z% }' D2 M* ]) W! ~) N) {3 h
  2. BEGIN+ S; I) B1 t1 l4 }3 x" a
  3. SET @sp_rtn = -12
    - x1 r' N4 x7 A+ \' e  |3 f& ?
  4. RETURN
    9 m& X2 F" u8 G; \* B5 V$ C% q
  5. END
复制代码

& f8 F9 E0 U) b* W4 [3 w( c$ A
0 i! M% a2 r. i1 z$ h6 X; `( Y
0 L+ _. G, Y  J4 ~' G
; Q- [) C* W: P: {2 V9 ~
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2025-11-8 18:56 , Processed in 0.089882 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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