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

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

[复制链接]

166

主题

426

回帖

8149

积分

管理员

积分
8149
金钱
2380
贡献
5177
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表4 u. Y4 V+ N* c  ]7 C

( ]# E# q5 N0 y4 c
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数7 X5 {1 Y7 x, @
  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 ($ I" O7 ]# r/ P) r3 A
  2.     @character_name NVARCHAR(40); Z& {) a: D% }7 ~% Q; ]
  3. )
    : e8 ]' u+ H5 p" \9 K( W6 o- S- Y. m5 ^
  4. RETURNS TINYINT, f( |* ?( T4 ]7 `5 T  C& n# {
  5. AS
    0 \/ P$ x% `) V  o( a$ t& {
  6. BEGIN
    7 v3 p( d# I$ }. `) K- {. L" m% L
  7.     DECLARE @result TINYINT = 0;# v# o9 {7 i$ ]: F+ b
  8.     DECLARE @char NVARCHAR(1);5 b: ]2 q' D# y# c4 \
  9.     DECLARE @i INT = 1;; y1 p$ p# ^! ^3 ^5 R$ m' ?
  10.    
    1 T% a/ w  c; c) |. z7 y, y, |1 }
  11.     -- 遍历每个字符,检查是否合法8 G' H. o  M, w. e. e
  12.     WHILE @i <= LEN(@character_name)8 b4 W4 q' \9 ~% M/ B$ T
  13.     BEGIN
    & r3 S; ]" g3 }) n8 n3 r
  14.         SET @char = SUBSTRING(@character_name, @i, 1);6 ^3 R; h* X* b+ m- \) o
  15.         
    ; S/ r* d# F7 M  D8 }7 c# H
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    ' B6 k4 \! ]$ ^- h. I# X
  17.         IF NOT (
    + M. B3 i. h( F9 ~
  18.             -- 中文字符范围 (基本多文种平面)# X9 Q5 _2 n$ Z7 A& R" x& u. }4 j
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    5 T$ `& t9 i! t; K2 H$ N
  20.             -- 英文字母和数字4 |& g" m' `! C# ~
  21.             @char LIKE '[a-zA-Z0-9]' OR
    " w, P3 R) n; z/ s- D  k, k5 [/ |! O
  22.             -- 允许的特殊符号, I7 X, t) H: T8 \, w- u
  23.             @char LIKE '[_ -]'
    2 u  b% C  P# a4 @, c5 b0 f/ ]
  24.         )
    1 I6 ~! W6 o- T' J- B$ Z: G# R
  25.         BEGIN9 ]* W8 t4 Q. ^
  26.             SET @result = 1;& ?9 B& y5 h/ D- c* i  O5 g
  27.             BREAK;) i/ z( j0 D8 _+ s7 Y) p0 b8 i& K7 b
  28.         END
    6 t8 o+ i% k3 B$ p' S' _* H
  29.         
    6 J5 H: ]+ A/ r0 f) ^5 R' |
  30.         SET @i = @i + 1;
    9 R: ], k9 [! |! e0 ]' F: o; H& d4 J
  31.     END;
    $ c- P! [4 @3 o. ^4 l
  32.     ' r7 ?$ [- Y  K1 D2 V3 n
  33.     -- 检查是否在非法名称列表中3 Y* j% ~1 }$ g0 e
  34.     IF EXISTS (3 V2 K7 c" r: h
  35.         SELECT 1 . N! n5 r+ r& _) K: G1 J
  36.         FROM dbo.illegal_character_names
    ' ~% F2 ^# d, f( U% C& M
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    2 J& M6 h. H$ H" O( C5 i) d- r; r2 \
  38.     )! h, N) j% L1 U, U* A7 Y; s
  39.         SET @result = 1;
    " I# u0 V9 i( T$ ^: K
  40.    
    $ e, b5 y3 o3 k
  41.     RETURN @result;$ I+ i; t* J- [! t+ w* m
  42. END</span>
    0 P$ d, f2 Y, R+ j6 R. H
复制代码
插入屏蔽的字符
0 E- `. f3 |/ W4 Z+ U+ W
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    8 w4 G$ P/ s9 P5 h" m
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    * T( H  V. w9 ~* ?1 d4 H  Y
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');/ g  y# S2 M/ ^
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    ) \) W$ p/ O6 F
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');" \# }3 b3 ?( @% c" i

  6. ' Y4 q. V2 y3 T5 l" q
  7. -- 示例:查询包含敏感词的角色名0 h  @. E+ I+ J5 i0 z
  8. SELECT *
    + }& P- `4 @7 }/ Q+ ]0 h
  9. FROM dbo.characters ) b2 K" o0 q/ w) C0 B, I  L; C
  10. WHERE EXISTS (
    7 L7 |3 |% `2 C% b7 J( M7 A
  11.     SELECT 1 9 [- L9 W, j% ?& d: o# g
  12.     FROM dbo.illegal_character_names
    , ^2 i! X3 w+ c8 b5 }% D/ h
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'' C0 l( _" R( L
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据" Z4 e( w9 O# K3 F; F0 s5 ?
原始为:! E6 C1 a2 j- c: j
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT" `  I* _+ I# l
  2. , u, C" M: \+ q" @7 q
  3. IF @v_ret < 0
    8 D7 _  ^$ J' K" d
  4. BEGIN
    + t% R8 i/ T5 R# N  A# G
  5. SET @sp_rtn = @v_ret
    ( E' U- D/ |* d9 m; o$ r: I
  6. RETURN8 n# P  Z( N* c/ c1 g- D. K# o2 `
  7. END
复制代码
修改为:
3 B; C+ m8 S% V
  1. IF (dbo.NameBlock(@character_name) = 1)
    - u( g1 Z9 g5 q  W9 l1 O
  2. BEGIN
    ! W5 D# W6 r! b4 j# R
  3. SET @sp_rtn = -12
    ' l3 T  c. r5 K6 P9 C0 _8 [% Q
  4. RETURN
    $ I" C1 ~, r+ A
  5. END
复制代码
3 V. W6 e7 o  J! ^5 P4 S  q

6 S$ X* D6 F3 e' S: J5 ?. G
3 T" [% B6 o6 G+ b4 P

' N* F' b  @! P5 |
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-10-3 11:52 , Processed in 0.061463 second(s), 29 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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