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

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

[复制链接]

154

主题

343

回帖

5846

积分

管理员

积分
5846
金钱
1835
贡献
3514
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
' g( e2 X9 y/ V; s7 q  v7 e7 E# M7 Z+ h, g  K7 X1 c/ m
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
. G- `  j' x* x* G
  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 l2 l- a# A3 {+ E1 ^% y
  2.     @character_name NVARCHAR(40)
    & b3 X4 ?5 D# j1 D6 q
  3. )
    ! U2 g. g, ~* ^4 C
  4. RETURNS TINYINT
    / A/ A5 t* \* w+ i6 \
  5. AS9 s9 y- P& E2 [( s8 n
  6. BEGIN. s* `) [' V8 _! I- Q/ W* C- U
  7.     DECLARE @result TINYINT = 0;
    2 P" V2 p) ^! w: f  D9 j0 Q% i! X
  8.     DECLARE @char NVARCHAR(1);  d8 f. [: A; e
  9.     DECLARE @i INT = 1;
    # P+ p. i: v) P* ]0 j. ?7 d# f3 g
  10.     * h3 j4 L' c$ V4 q5 U
  11.     -- 遍历每个字符,检查是否合法4 o/ S4 [# |6 `3 n
  12.     WHILE @i <= LEN(@character_name)
    - B( t( O, u. d3 `
  13.     BEGIN
    3 \4 x" A- N; \* x+ {" g2 k6 S
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    5 i" ~+ p( g3 }' X  L
  15.         9 w' g) t' z! b
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号( w0 }) ^5 S( K* l- v2 j. O3 O
  17.         IF NOT (
    5 {  u$ j/ g, ~
  18.             -- 中文字符范围 (基本多文种平面)
    2 B6 E* K1 p! ^3 w! X; v
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    % D6 k- O3 q  \+ r8 K( d
  20.             -- 英文字母和数字
    1 N4 n, K* r7 X" b/ N
  21.             @char LIKE '[a-zA-Z0-9]' OR% _2 r  X8 J/ L9 `9 X
  22.             -- 允许的特殊符号2 }5 m* p' y% W1 X7 u# u& m( n8 t
  23.             @char LIKE '[_ -]'0 k- ~0 E. o5 t( s
  24.         )- z; v( x- F+ }6 g' R1 O
  25.         BEGIN; I% a, V4 b! }
  26.             SET @result = 1;( A: W& E0 T" R- y- o" W) `) m0 ]
  27.             BREAK;
    # @7 M" Z7 d6 e- ~5 p" c7 T
  28.         END0 X+ M2 X8 c& ~% y! K5 q, T
  29.         0 t3 M8 X& `7 U" k  {2 N0 g
  30.         SET @i = @i + 1;5 v" h) @9 t9 _  r
  31.     END;
    ) \, R# Q! C3 i# C: ~; R0 a! K6 }
  32.    
    8 K& I* B' p. R8 q
  33.     -- 检查是否在非法名称列表中( t& V+ z; m0 g
  34.     IF EXISTS (' c  }& e1 }0 h% t1 A% m9 H
  35.         SELECT 1
    $ ^/ v& C* @0 D, l
  36.         FROM dbo.illegal_character_names
    . L6 P5 O# A3 l0 _/ T' A* h2 t
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    5 T: o" F6 P" [# S9 X+ |! i
  38.     )0 g1 ]% m% i# J5 B. {# M- ^  w
  39.         SET @result = 1;
    % w" U' f* Q; l' a0 p& ]/ I
  40.     9 \" ]- a# N6 I! u
  41.     RETURN @result;
    3 ^3 R9 R: v% n  Q7 E
  42. END</span>: p6 ~: J6 t. f9 ?8 [1 X! `% Y3 Q
复制代码
插入屏蔽的字符- z; b# \9 t3 @9 h+ L5 S" P+ Q7 I
  1. -- 插入非法名称列表(明确列名并使用N前缀)% J3 h- a8 W+ Y$ J2 a9 g0 |
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');4 ]7 l6 b+ a+ n. o2 b) t) Y  q
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');+ E$ l. D' H9 o& k8 Y0 w
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');. h" i8 @) |2 G
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');0 C$ ~) F7 `! k+ s: G. V
  6. 2 j1 v1 E. t; T6 ^' w
  7. -- 示例:查询包含敏感词的角色名
    6 m. p, X% i  S$ ?0 T
  8. SELECT *
    ' S+ G6 B! ^3 G) n
  9. FROM dbo.characters
    / ~) Q2 ?6 o! k
  10. WHERE EXISTS (, g( r+ l/ I; G; ~( @
  11.     SELECT 1 ) L: A! y' I3 R8 f& @2 i) g, Q
  12.     FROM dbo.illegal_character_names $ E2 q8 n+ N' P- H, \
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'6 M( w" l0 y. s( t. d8 J
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
- b) n7 }* v3 q6 k! {+ v原始为:
8 T; N! m& x( z, t6 A. T9 Y8 t
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    ! T9 e* B$ O' x  j0 \* r1 a5 V. `' [
  2. % W8 E7 [& B; j' [" e% Q
  3. IF @v_ret < 0 5 `, Z" ]- ~/ Y
  4. BEGIN
    6 Y/ q; o5 q0 A) ]) u$ T; t) P
  5. SET @sp_rtn = @v_ret
    - |5 E: [- N) c5 d% O% o3 Q, t
  6. RETURN( X) s$ Q/ m8 W  x) o
  7. END
复制代码
修改为:
7 R. Y2 x/ d$ i/ {
  1. IF (dbo.NameBlock(@character_name) = 1)6 v$ T7 z6 n% J6 n" h) Q6 }
  2. BEGIN
    2 Y4 b, s0 ~  `/ f- H% Z* A
  3. SET @sp_rtn = -12( J6 a3 N& v0 _( m4 v- {
  4. RETURN8 R% z$ M* e9 C8 v
  5. END
复制代码
& v  b2 _0 t/ u: B- f

: f+ p8 {7 G" K! V2 a: ~' B
6 v4 V" o2 g+ G1 {* c
& D3 U% ^" L4 K9 Q! Q
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2025-12-10 12:13 , Processed in 0.070317 second(s), 24 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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