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

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

[复制链接]

154

主题

343

回帖

5868

积分

管理员

积分
5868
金钱
1839
贡献
3532
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
! w7 h+ A: H  J/ [, W# e5 L% i. b1 D0 m4 b) d
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
7 l# |4 r$ V: i! r$ Q" a! 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 (  z- [% q/ ^$ w0 G% `1 P
  2.     @character_name NVARCHAR(40)
    * T, @; l+ E0 d8 L1 i0 c
  3. )
    # F$ X. c4 s6 e- U
  4. RETURNS TINYINT
    1 W/ x" J1 V7 Q. l6 D
  5. AS
    ; h5 g  ?2 m9 ?
  6. BEGIN, ~, J# e8 O! k. _* i
  7.     DECLARE @result TINYINT = 0;
    * p3 [  Z  R2 e  \. \3 U- v+ @
  8.     DECLARE @char NVARCHAR(1);8 A/ W) u% E8 R- n6 O
  9.     DECLARE @i INT = 1;4 D! t  `" n( q) _. Y- @
  10.     # m8 j7 ?/ j) O& z. m
  11.     -- 遍历每个字符,检查是否合法
    , X: v' I1 o+ O, V1 m' ~7 }
  12.     WHILE @i <= LEN(@character_name)
    7 p# k* t2 J# R6 F
  13.     BEGIN
    + }0 Y2 c5 E2 D
  14.         SET @char = SUBSTRING(@character_name, @i, 1);. h/ U3 l4 R, n: a- }
  15.         , b' H, p8 W% h4 R; k* l; U7 i
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号9 L5 p3 a' Q0 ]' M; |8 T& U
  17.         IF NOT (  W* n# p5 E- ?% M7 f
  18.             -- 中文字符范围 (基本多文种平面)9 E. g3 h% {- J5 K
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    ! ?9 u* A5 \5 j
  20.             -- 英文字母和数字( p' T" A% F$ ~  j! Y( m
  21.             @char LIKE '[a-zA-Z0-9]' OR; k' H; A- ]: s$ \9 n
  22.             -- 允许的特殊符号
    9 R1 Y! `: M3 s! A9 E
  23.             @char LIKE '[_ -]'6 {. `& ?0 ^8 d. z
  24.         )
    5 J% i# a7 T! ]+ @. C4 C
  25.         BEGIN
    ; U+ v4 P  l5 |7 q* [
  26.             SET @result = 1;. z" _0 @4 N& p) ?) {
  27.             BREAK;
    & Z) }5 ~5 `4 M6 A5 R  H5 D4 z
  28.         END' F: V' p: T* d1 I" W
  29.           M* E6 f- O- [+ n: ^5 V3 ?
  30.         SET @i = @i + 1;
    0 g( |/ j: V) K& i5 a: {6 \9 K' r
  31.     END;7 M2 G; Z/ @3 U" n! ]
  32.     # V+ y  ^4 N( C$ Q/ p- f
  33.     -- 检查是否在非法名称列表中  U: h. ~- w" ^- v2 \2 [' y! E
  34.     IF EXISTS (0 Z# b' v& L5 i, H1 t- X2 Q% @
  35.         SELECT 1 % H3 x  V. X, a8 h
  36.         FROM dbo.illegal_character_names
    0 r" U1 ^, @+ r( s
  37.         WHERE @character_name LIKE '%' + partial_name + '%'" R1 t: q/ R6 C5 ~
  38.     )1 |5 |2 t* H9 q& a+ m& h
  39.         SET @result = 1;* x8 R+ L/ I5 v1 h( P( `( K
  40.    
    1 G3 M* W) n  x
  41.     RETURN @result;2 W: I2 n3 V/ u
  42. END</span>
    4 _8 P- g& A* T2 c7 |& H- @
复制代码
插入屏蔽的字符
- ^* g2 W0 {( V# s" H- Y
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    ) V5 F! b; N- O/ a# m5 z
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    ; W9 K4 _& R/ Z; P2 p! W5 q0 }# C
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    3 `& k; A; ^$ b7 u$ |
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');0 A* D" B0 W3 s1 L- F  m
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    ) k8 m: t9 ]' j. t6 [8 N

  6. 2 m# }; s& q) A. S/ L( i
  7. -- 示例:查询包含敏感词的角色名
    6 Z0 O  M7 A8 P. Y, x( E# V
  8. SELECT * 6 m* J! r! \$ y" j
  9. FROM dbo.characters
    ; v8 v$ A. Z/ w" {7 g* u
  10. WHERE EXISTS (( \2 e2 z$ d5 p5 x5 k- w- X
  11.     SELECT 1
    8 {2 p! V  L5 J* H( v. s& ]
  12.     FROM dbo.illegal_character_names 4 f5 s! x9 x. i6 B) t
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    ! `0 H+ q5 b# K) R+ v. ]
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据" y1 j! Z5 A* m" q* R0 e* B
原始为:
4 A' v* N! B8 D8 i2 P  o' W
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    2 E, E: N+ Y) j0 G0 @
  2. 7 r7 N$ }2 I/ {/ W2 l
  3. IF @v_ret < 0
    # }9 q) z* i5 O* B& k! H
  4. BEGIN
    ( U% H. B2 y6 }& \+ \
  5. SET @sp_rtn = @v_ret2 J9 p0 U6 g, Z7 r( r
  6. RETURN. K( j. p3 N% I! p6 u0 {. n& e( h% P
  7. END
复制代码
修改为:/ c# c1 }; W1 [; s8 m, m4 Y
  1. IF (dbo.NameBlock(@character_name) = 1)
    ' S! P" ]( N" t
  2. BEGIN
    $ I. v7 @: D7 E. T, `
  3. SET @sp_rtn = -12
    5 g: \6 k; X7 ?; T1 L  s
  4. RETURN
    . @' ]5 P+ C; \" G
  5. END
复制代码

2 N7 v7 f& Z% z4 b
5 K9 A% N; H  {0 J" `5 l9 e' X3 ~  o
4 I- [& |7 t) s+ r2 n, C6 ?
; w5 Q1 w+ o# W! ~. W
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2025-12-15 21:00 , Processed in 0.314757 second(s), 24 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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