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

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

[复制链接]

142

主题

268

回帖

4542

积分

管理员

积分
4542
金钱
1564
贡献
2568
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
1 }7 }& j2 S% ~2 g" Z* y' _# |
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数8 A! ^: m* _6 r/ W/ o6 a
  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 (: H4 D4 E& z& ?$ c2 G) P1 S% D
  2.     @character_name NVARCHAR(40)
    0 y, C  w) z9 E5 A4 T
  3. ); i6 N3 G3 m  r! ]3 w3 ]% n" P
  4. RETURNS TINYINT( T8 O1 Y) t+ R& Y3 T( }7 i
  5. AS
      M& P  m! g3 s1 d- x( m
  6. BEGIN
    2 l& {2 _* M! C. K: E" l% d- ^
  7.     DECLARE @result TINYINT = 0;) m  p4 ?2 t9 F
  8.     DECLARE @char NVARCHAR(1);$ M: D+ H, e' W- `; h3 }
  9.     DECLARE @i INT = 1;
    / T- f0 D) c  h4 v0 `
  10.    
    : F* L. p- E" i; Z
  11.     -- 遍历每个字符,检查是否合法
    . A3 @/ U5 Y6 [
  12.     WHILE @i <= LEN(@character_name)
    # W, o; L9 w5 v$ j' h+ T$ x: }& j
  13.     BEGIN
    4 V& d6 ?1 e& ~' A
  14.         SET @char = SUBSTRING(@character_name, @i, 1);7 Q1 x5 s$ h* N. O. Y5 U
  15.         
    ) B% \- H: A# T5 M% q$ ]
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号- r, h! ]# P& `$ O0 w9 q0 \- G
  17.         IF NOT (
    + }% }$ ~3 L# g
  18.             -- 中文字符范围 (基本多文种平面)+ a: ~! U2 m* w4 ?  [- `' x
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    . Y( U  w# @1 ?' Q) c- ~) E4 W
  20.             -- 英文字母和数字
    - A8 k2 X! T: ]( c" v: o  c) |
  21.             @char LIKE '[a-zA-Z0-9]' OR( |$ {9 n4 [2 P8 a/ I: d: Y
  22.             -- 允许的特殊符号/ {& v* A4 M4 z. u5 l
  23.             @char LIKE '[_ -]'4 z5 k# T- |  F2 \
  24.         )% K# T" ?' T+ t$ E6 {# o- R, d3 ?
  25.         BEGIN
    7 V: B& A7 ~- {9 T% ]% Y, y2 d
  26.             SET @result = 1;
    1 {5 L! B" O1 P2 N" m* l; L% R
  27.             BREAK;6 c! r) c1 `3 {- e' N9 p2 F, f
  28.         END
    # v. ?9 }9 w; P$ S0 p5 _5 |
  29.         
    * i: U- `7 d- E
  30.         SET @i = @i + 1;- y8 V- M% r& E* |0 j
  31.     END;7 k" M8 I2 F" f: o
  32.     9 C% D7 H* J$ F) a: u; J6 U+ V: c# Z
  33.     -- 检查是否在非法名称列表中
    8 G. q6 B2 T5 ]8 U% _
  34.     IF EXISTS (7 {3 \5 _0 W' M* d7 D3 L0 S
  35.         SELECT 1
    2 q* `6 w! q' C! N: t- Z9 E
  36.         FROM dbo.illegal_character_names
    5 U! G6 O3 ?: g; m8 _
  37.         WHERE @character_name LIKE '%' + partial_name + '%'9 A% o8 X* K5 h1 b
  38.     )& b6 F1 @7 e/ C1 g$ Y
  39.         SET @result = 1;
    - I4 r/ U, t9 d0 N
  40.     : x9 W. |9 w  o* z& I, u' H
  41.     RETURN @result;
    $ O/ n" s9 u, y! b' d
  42. END</span>
    ) w& K: ~$ R, Q4 F/ r& t# z& E
复制代码
插入屏蔽的字符
# M% e6 z5 N3 ?0 a. B
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    7 v7 n4 s% q- [6 X
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');( p* j8 o1 Z5 L+ C; ~' p- o& D5 E
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');( c: J2 U8 {; d: B# Q
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    7 e  C5 y' z" L
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    ' D2 l& D; ^- j9 X8 r. m% G
  6. & P0 [5 w! [1 ?5 T# B  j; t
  7. -- 示例:查询包含敏感词的角色名3 f' A4 r% l  F; L( o8 X
  8. SELECT *
    ( E; Q' f6 l( f( i; }* \- X9 @
  9. FROM dbo.characters 5 X$ Z( L; U) l; a& Q; O
  10. WHERE EXISTS (
    7 [; ~) h5 Z, C$ V
  11.     SELECT 1
    $ k: }0 v. d/ Y  r% ]
  12.     FROM dbo.illegal_character_names
    ! ?. N. m* b+ [0 h. R, T* `% T
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%', j1 A5 Z7 Q4 e. \% Z# O0 M
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据5 m# A. C6 {! \: S/ R
原始为:
: z8 Y+ t$ |3 K% b5 u
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT4 z0 z3 Z- y; c

  2. 0 z2 n2 e! z, x, F! j
  3. IF @v_ret < 0 ) D# f3 d2 \: a/ Q0 U
  4. BEGIN. K1 q' K' t5 m7 t, i" O4 U  U& v
  5. SET @sp_rtn = @v_ret4 ^; w- N5 s* X6 w; H+ T4 ?
  6. RETURN: l7 ~) K& q% o
  7. END
复制代码
修改为:2 G# u9 M; W* A! L5 r4 u! U" X
  1. IF (dbo.NameBlock(@character_name) = 1)# s) d* k* [* E3 L7 [' M* L
  2. BEGIN. Z$ d7 J& k5 Q$ E4 m
  3. SET @sp_rtn = -125 t) H0 z4 D- \$ n
  4. RETURN
    ) z( x( L! x; u+ E6 ]
  5. END
复制代码
0 }: S4 I; A  ]* B( K% N6 f2 X, z+ C
* Q% s" l3 ^" {  n

# V& ?  T0 Q( m6 }' r

7 j  O/ c; y% x# t$ |. x
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|EGameol

GMT+8, 2025-7-31 15:49 , Processed in 0.047861 second(s), 26 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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