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

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

[复制链接]

157

主题

362

回帖

6843

积分

管理员

积分
6843
金钱
1944
贡献
4380
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
3 G$ _6 }* m, P6 B' z! P" \, `. b0 {6 {/ G( u, r# _/ W
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数7 Z4 a2 w# ~- H
  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 (
    6 ~& z4 I* I0 Y) l+ Q
  2.     @character_name NVARCHAR(40)% t+ Q! k+ ]) L- H9 a7 x1 B
  3. )/ O) e! ~1 R3 c# D
  4. RETURNS TINYINT
    / x% U' ?( @1 m+ K. }! O7 k
  5. AS
    - e6 e# R; I: S5 b4 C; w# s& B% p1 J/ D
  6. BEGIN8 t& G( l. r8 L4 O, e
  7.     DECLARE @result TINYINT = 0;
    0 B- {) g8 j" }8 I1 R/ K( g  X
  8.     DECLARE @char NVARCHAR(1);
    5 \& T" a* I* u; i# S+ L
  9.     DECLARE @i INT = 1;
    1 W+ x; n! k2 L
  10.     / P7 @5 L- H3 e& N/ ]
  11.     -- 遍历每个字符,检查是否合法
    + r+ D) Z, Q. w
  12.     WHILE @i <= LEN(@character_name)
    : ~6 V0 ^1 u- o" t$ K: ]
  13.     BEGIN! E7 x! P# Q  D9 e$ B
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    5 y* p+ P% U6 l: F/ W# w
  15.         
    * _3 x) q5 l: v7 x9 \: ^; c6 V( V
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号3 g# G8 D% I# T2 U
  17.         IF NOT (, ~3 U" a& O2 V/ S6 ?& e
  18.             -- 中文字符范围 (基本多文种平面)
    4 v( j8 o2 z2 R9 ]
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    ( V8 d, s! l/ T( Z+ Z# M9 V6 a
  20.             -- 英文字母和数字6 j8 R9 O+ r' O
  21.             @char LIKE '[a-zA-Z0-9]' OR
    & d# u9 @/ V# K, _0 B* V6 Q1 c
  22.             -- 允许的特殊符号
    $ i# w* z/ O8 G; ~
  23.             @char LIKE '[_ -]': [4 p) `5 r# o' [% m) X
  24.         )
    ' z) x: V8 d8 v1 Y6 E
  25.         BEGIN# A, |1 c" P' P3 P: w
  26.             SET @result = 1;
    : I& Z) R: p) d( a/ s: j# ~" Z/ Z7 W
  27.             BREAK;+ Z0 N" e3 g0 M- Z
  28.         END
    8 T8 c; M6 I$ ?" w9 _
  29.         
    2 q/ c' {7 e6 Y; G. {
  30.         SET @i = @i + 1;5 Q& ~) v! B; b$ P
  31.     END;
    0 n( i7 `2 U* `; w/ C( u
  32.     " @1 x( |/ n' k1 m
  33.     -- 检查是否在非法名称列表中7 X) T7 B2 M' K2 x$ _, y- f
  34.     IF EXISTS (0 w- e) J" z9 N8 c1 I
  35.         SELECT 1 4 ~7 d$ H) W  `- _9 F4 G  l/ h
  36.         FROM dbo.illegal_character_names + m5 ^: H$ J, Z9 G4 m5 z1 @/ e& F
  37.         WHERE @character_name LIKE '%' + partial_name + '%'. M8 H* V; R2 }5 u- i
  38.     ), Z, t: N- K% g; Y
  39.         SET @result = 1;% S5 J: ]( ^$ p0 e% Q& N* T+ P& C
  40.    
    / t) q4 d* l7 G$ N0 m7 M2 ]4 P
  41.     RETURN @result;+ P7 {/ v! a% K% ~  F2 q& I
  42. END</span>! @( F1 [! L0 G) Y- e4 c. p
复制代码
插入屏蔽的字符
6 Q/ b4 K# g; X+ F- M
  1. -- 插入非法名称列表(明确列名并使用N前缀). P" Y, A# s" F5 r( }
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    ) u% R% Q: P& a0 V9 \
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    - Z$ \6 E' ~" I. W7 P6 Y- O6 Q
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    ) L: w& N8 ^2 V( k$ E, D
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    7 ?. l$ L: |, C( W# A
  6. ! @9 t7 c* r' n2 \2 K# N! M
  7. -- 示例:查询包含敏感词的角色名
    3 n: w9 d) b+ _+ t
  8. SELECT * , N0 J3 w7 v& C
  9. FROM dbo.characters
    2 E- W# d. H' u- m' w( L% C
  10. WHERE EXISTS (  \) e  {' y& H/ G7 k
  11.     SELECT 1
    * O6 [( k+ g$ T9 ?9 o0 P
  12.     FROM dbo.illegal_character_names
    $ W0 @5 n! [5 y4 d
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    - P  `( R$ i. m5 p3 t( u, [  n: O2 ^
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据# q, ^8 Y3 N% m5 z. H
原始为:% J+ ]4 W. q3 p" }+ F8 J
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT( C3 D- O0 d; l: B# Q" x
  2. 7 A. s% Y  P( c9 u( @
  3. IF @v_ret < 0
    - P& t5 @# Y3 `: b  G+ V8 G
  4. BEGIN% d, {( X0 i: `+ F
  5. SET @sp_rtn = @v_ret
    7 a1 z$ d6 ~" a) E4 ]
  6. RETURN' r; I* M$ H) r0 j+ b
  7. END
复制代码
修改为:- ~( L( S7 I+ f: n1 Q( O0 k% E
  1. IF (dbo.NameBlock(@character_name) = 1)
    5 A: \+ }: h1 b! a" K  v
  2. BEGIN7 J0 G8 @  P# P0 t3 [6 I
  3. SET @sp_rtn = -12
    6 Y1 I, p  k- [0 R) ]# |' u( X
  4. RETURN; S( j9 C2 i$ v  R- j4 H
  5. END
复制代码

* Z+ {0 |) f7 R$ Z( q7 g& w& q% Q, w( M% ?$ w5 D

1 w9 Z, Q# D8 r; E- F& A2 O& a) ?
* R. t" {3 T5 F7 B1 D0 z& u6 {) y
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-2-16 17:00 , Processed in 0.045939 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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