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

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

[复制链接]

140

主题

248

回帖

4324

积分

管理员

积分
4324
金钱
1520
贡献
2416
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表9 \$ H/ \( O# h9 c% g2 n8 ^* z

% ?) h$ W8 U* J3 M
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
! C9 E" @# }0 y; ]- N
  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 (# `9 c/ o1 ]" S4 ~/ d  q4 {- ?7 a: o/ p
  2.     @character_name NVARCHAR(40)
    & x6 Z/ z# E$ p# @
  3. )+ A4 G; `8 h6 r* P3 x; ]0 v
  4. RETURNS TINYINT
    % `- t0 _# |6 i$ K
  5. AS# X, b, _0 j5 j9 t+ x  y* ^9 P
  6. BEGIN
    : Y: x& M9 q9 s1 x1 q
  7.     DECLARE @result TINYINT = 0;- E* l$ |$ z8 @! ~! D% a* l6 q
  8.     DECLARE @char NVARCHAR(1);$ [8 l* ]- }8 [9 j2 C
  9.     DECLARE @i INT = 1;
    ' I+ z6 ^) z& ~/ v6 C" k  @
  10.    
    / U$ m. o$ y: A0 M! e; u
  11.     -- 遍历每个字符,检查是否合法! t/ M: c. P4 L: A2 z" a1 E# c1 n" k, O
  12.     WHILE @i <= LEN(@character_name)
    : _" K- p% b3 K4 g( Y
  13.     BEGIN
    2 y& v, y$ \7 A6 S$ [
  14.         SET @char = SUBSTRING(@character_name, @i, 1);# b1 T/ O9 B1 {* ^8 t
  15.         - h# y- R( h# ]! R' k, ?
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    , K, H. O" Y9 X, K7 ^
  17.         IF NOT (6 m  y' H' }' E# W  Z' W! Q  X
  18.             -- 中文字符范围 (基本多文种平面)+ y7 e) R6 E' `5 U; l+ N
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR! a: C/ b- |2 E" a; b) \
  20.             -- 英文字母和数字
    ' p6 A* P1 s0 H: r
  21.             @char LIKE '[a-zA-Z0-9]' OR
    ; i; b& Y" s- Z5 g* B8 `& g6 R
  22.             -- 允许的特殊符号
    ; W& p$ i4 X, L; j; X7 u9 r
  23.             @char LIKE '[_ -]'" {' ]  }6 o0 m$ ?  b
  24.         )
    $ g1 U: `! v) ]1 ^6 @
  25.         BEGIN
    5 x$ Q! Y7 X0 {9 c
  26.             SET @result = 1;
    6 }2 |/ w& @1 X0 S, i. Q
  27.             BREAK;6 i7 k5 F' _! }% G& z! k# N1 {
  28.         END
    " \: h3 G+ T) h% g+ ~& g# X
  29.         
    " `( E3 B% ^. j. Y9 @4 `0 g
  30.         SET @i = @i + 1;
    ( I" `# z1 s" G  D% x; A) W8 t
  31.     END;2 q5 v) W) U4 N5 L3 ^% v6 q% G
  32.     9 D, w. c9 u$ F  P0 D) g2 q5 O% }
  33.     -- 检查是否在非法名称列表中
    ) w- y/ A2 ?0 q$ h( k
  34.     IF EXISTS (
    $ X- {* d8 q+ I% J& C" C: [
  35.         SELECT 1
    - F1 W; B% {% X3 W0 m6 u) n
  36.         FROM dbo.illegal_character_names
    ( g! M# _" F5 \
  37.         WHERE @character_name LIKE '%' + partial_name + '%'8 c2 E  t3 X9 ?/ q% w
  38.     )
    ) u2 ^$ Q! h+ `2 H  t0 J
  39.         SET @result = 1;/ {( B( F1 y% F- `) i
  40.    
    5 r1 }& o1 N9 K! a6 Q; h
  41.     RETURN @result;) i; i% P- n$ F: I9 R
  42. END</span>
    8 w: \" I1 g8 r+ N4 C) P
复制代码
插入屏蔽的字符
0 V% F0 v) Q* r" @$ P  p
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    # I' T0 t: m& y0 h3 S
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    ) l, C) c# Y1 o  `3 _
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    + }/ E) e% ~2 B2 N. ^* q) E
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    ; z& |5 }7 e- f( f1 Z, z
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');5 ~* c% M7 B0 F" k: |
  6. 5 m( f' q( q  W
  7. -- 示例:查询包含敏感词的角色名* k, H, [, o( s2 a. {5 P
  8. SELECT *
    / y  b9 v* {) k- w: I
  9. FROM dbo.characters # O$ l) l+ \7 m) I! B
  10. WHERE EXISTS (2 ?3 k# K1 L7 a* f) O* b' I. x
  11.     SELECT 1 " r! s! I* Y4 I' R
  12.     FROM dbo.illegal_character_names 5 y" l4 O+ Y" J- \, I6 e# i* W
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    ; C  P6 {0 {4 N! K+ k
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
4 C  H2 c9 A3 p7 {! W/ ~原始为:; b5 X. K& o9 c7 M. F* h% e8 e9 r
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT; p! K; ]3 {; x  W; o9 m
  2. ; v6 A4 ~5 @3 @5 C. o
  3. IF @v_ret < 0
    % c& K6 O0 F5 f* z# V& Q
  4. BEGIN
    $ g1 k1 H9 K1 K
  5. SET @sp_rtn = @v_ret
    # [& @9 _# C, b9 z+ N6 B$ F
  6. RETURN
    0 }. ^/ e# ]4 v, z5 N9 [
  7. END
复制代码
修改为:2 f7 ]1 ?3 h; R6 g, O% f* m3 O
  1. IF (dbo.NameBlock(@character_name) = 1)5 Q2 Y# b* R# g* v! D$ d+ p
  2. BEGIN
    ( H" O0 ^; h( s3 O* p# {5 \
  3. SET @sp_rtn = -12
    ! l  y' F9 M. W9 v
  4. RETURN; b8 p; n% d( p! m1 R" I) g: N
  5. END
复制代码

! Z: I) R7 l. d3 ^! C& u% E
+ F7 ^, d$ O1 A4 {$ `3 V: `) C& [) B) n  s/ ]: a: s3 B

3 U: ~0 q: U% z# \! y
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|EGameol

GMT+8, 2025-6-30 00:42 , Processed in 0.061075 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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