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

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

[复制链接]

147

主题

283

回帖

5153

积分

管理员

积分
5153
金钱
1643
贡献
3080
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表3 T5 T1 V/ H) J7 e$ o

4 e6 A5 u9 _2 A7 N* N2 o, X- F
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数' C5 N* F( q+ E3 |, z
  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 (
    ( Q9 E4 V, [2 N* k0 c& d
  2.     @character_name NVARCHAR(40)
    ) }6 |# n* m3 G$ r
  3. )1 U. e5 P. W' \( x* D; g. Y
  4. RETURNS TINYINT: j" [  f1 i3 q2 G
  5. AS
    7 B& U2 ?, }% v( y  a  ?
  6. BEGIN
    ; v5 t6 v1 T5 r) V& K
  7.     DECLARE @result TINYINT = 0;% X! U3 G: K( ~: G) n/ y
  8.     DECLARE @char NVARCHAR(1);6 c/ J( A% t5 ~+ m, _! ~
  9.     DECLARE @i INT = 1;
    % E2 L# g) l4 Z# d% x! h
  10.     $ b9 C$ ^# f; p. Y5 f
  11.     -- 遍历每个字符,检查是否合法, d4 k4 O0 T( V
  12.     WHILE @i <= LEN(@character_name)
    0 R' w4 w- i/ l7 h
  13.     BEGIN
    ) z: g% R( g5 U2 n6 Z  f, V) q+ V9 ]
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    7 U/ O! C, `. p- \) r- J' B
  15.         
    , @' S6 A; E# G" ]$ z
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    $ F+ _0 c9 M" r" v2 N5 W3 N
  17.         IF NOT (+ X- X: C) N3 T- f8 P
  18.             -- 中文字符范围 (基本多文种平面)
    8 a: g( M3 E; V! x% N
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR" h! r6 U2 o' B: }0 u9 j
  20.             -- 英文字母和数字* `6 v) ~" {& e9 Q: t( P
  21.             @char LIKE '[a-zA-Z0-9]' OR; t4 E$ w, N* y3 V" ?; h
  22.             -- 允许的特殊符号: `4 x, O" F6 T, }) O
  23.             @char LIKE '[_ -]'
    ' W& e5 j. B  K: v) j* J4 S7 Y: b
  24.         )- S' k* ?6 ]5 d8 i1 m  n
  25.         BEGIN
    ' c( Y! e6 q2 ~) l1 Z
  26.             SET @result = 1;
    + Y9 V* J. g) i' H3 [+ _' s
  27.             BREAK;% `/ o/ ]6 E$ W& o# v8 R2 u
  28.         END: X% _3 s# d2 D9 y" ?
  29.         & C" E8 y9 T! U4 {
  30.         SET @i = @i + 1;* q% L5 P8 Q0 [8 F
  31.     END;
    # W" L1 p- Q9 ^8 U# P
  32.    
    5 t! x/ U, L1 A" ^8 w& O
  33.     -- 检查是否在非法名称列表中
    , n: O+ I" ^& h
  34.     IF EXISTS (
    7 L8 G0 L+ E! T/ [# k6 o( @, Y7 g
  35.         SELECT 1 & x5 X2 J7 z2 i
  36.         FROM dbo.illegal_character_names . G1 G. A3 r: Y% P- n4 p7 S8 l; x6 I
  37.         WHERE @character_name LIKE '%' + partial_name + '%'; M! g% t6 t% W+ Y, p2 j' ~3 s
  38.     )- q5 `  U' b3 C3 m; g7 ~9 Q
  39.         SET @result = 1;1 |% [( t% X. ^% e  c6 W! N" Z
  40.    
    & c3 {7 v. P. x8 [3 m$ m# l, Y
  41.     RETURN @result;
    1 a0 @# a7 L1 X6 ]+ u
  42. END</span>
    " ?9 d  V$ b, H5 e  h
复制代码
插入屏蔽的字符) b3 {7 f" g7 ^
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    1 t$ V$ E7 U+ X$ ~
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');: O, W/ b, D3 |
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    * p3 k2 j5 u1 }0 m* X
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');$ t6 E7 C1 n4 _+ F
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    ( }3 y5 t9 A7 Z1 b' ?8 S7 B; u5 R+ `

  6. 2 c( N! o& a+ |+ V% Y# X1 l
  7. -- 示例:查询包含敏感词的角色名9 p  Q  S5 f% i) C/ h( r1 G9 M  e  o
  8. SELECT * . f4 i' _) X8 L& N7 r1 d
  9. FROM dbo.characters 2 f' l3 Y  M: n/ z
  10. WHERE EXISTS (
    4 J4 P! L7 M" `
  11.     SELECT 1
    0 z3 {$ _3 P. h' u* X. ]8 v" W
  12.     FROM dbo.illegal_character_names
    ' K: M& O5 G  J$ R% Z" T/ o# k( e. I
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'6 Y& _4 M1 l2 U7 Y$ q2 F
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
- }  r: I" B5 u+ p9 l原始为:8 }, T, K+ b1 ~, g! W+ ]1 P, {. j8 H
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    1 v1 Y$ P- H9 l5 h: M
  2. 2 N1 E: u9 O) K0 A* w) l$ K
  3. IF @v_ret < 0 # b/ V" f" A8 P& q) ^! j
  4. BEGIN  A- s' \4 o' a$ `
  5. SET @sp_rtn = @v_ret. F+ ]. \0 W; X0 b' T
  6. RETURN, D: T) a/ R; ^( i/ w
  7. END
复制代码
修改为:
4 ^, j- W5 A4 ]* j; q
  1. IF (dbo.NameBlock(@character_name) = 1)
    ) r7 a/ l' d- j
  2. BEGIN: p/ L2 F% T- Q0 L- E  P: w" t* [
  3. SET @sp_rtn = -12
    . d# ^$ {( q9 r) m: I/ [3 P# p
  4. RETURN" Q6 ^1 k, c8 [1 ]3 v2 h- |
  5. END
复制代码

; ^% b, Z/ I: l; k7 ?
1 {$ z8 D- S: N+ \$ v
* `+ Q; ?) V+ `

) n; p' B5 J, E3 }- `
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|手机版|小黑屋|EGameol

GMT+8, 2025-9-15 18:52 , Processed in 0.057036 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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