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

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

[复制链接]

155

主题

348

回帖

6155

积分

管理员

积分
6155
金钱
1868
贡献
3784
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表( k; N/ H3 |4 v. d5 V3 e
) R3 e- l. @" V9 x# X) K. K
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数/ g# v4 t/ i, ]8 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 (
    4 X, b# j! [4 Y* E/ j7 p* S
  2.     @character_name NVARCHAR(40); j- Q& r/ @) A: y
  3. )5 @. Y) G( r- H0 y+ z% }$ J& J- X: d
  4. RETURNS TINYINT
    " \+ x! s% c4 k* y. m1 }
  5. AS8 [( [6 K- M; W
  6. BEGIN
    ( ?2 N. E. s; s9 z) E* ~  V
  7.     DECLARE @result TINYINT = 0;" y6 H# C/ y7 |9 }# n' Q9 m0 T
  8.     DECLARE @char NVARCHAR(1);
    . {$ C9 t( R0 L9 L8 E1 N
  9.     DECLARE @i INT = 1;
    + S, ^" }9 e  ~
  10.     ' }0 `) ?9 S+ u5 W2 p8 [
  11.     -- 遍历每个字符,检查是否合法+ h+ f- V1 |1 a$ e
  12.     WHILE @i <= LEN(@character_name)9 \* [$ J0 t4 N# a8 M+ M6 r4 L
  13.     BEGIN
      T, I3 Y4 O+ |" Q5 D$ x/ c3 H
  14.         SET @char = SUBSTRING(@character_name, @i, 1);  c/ x$ @  P# z4 D) Y6 S
  15.         1 v) z! P' z* l, _1 L' b8 U
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    + `0 s# z- U0 |' ~
  17.         IF NOT (
    ' ?! y/ O! m( e. x1 `" [% ?
  18.             -- 中文字符范围 (基本多文种平面)! G4 V/ M5 Q/ q7 ~+ p
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR4 [/ Q+ h# d' g8 i0 w
  20.             -- 英文字母和数字
    . B7 G7 b! [! e* T8 ]  S' \
  21.             @char LIKE '[a-zA-Z0-9]' OR
    % q4 d1 o$ w9 j" V
  22.             -- 允许的特殊符号
    - h8 v* m+ H' Z- e' z
  23.             @char LIKE '[_ -]'" S- v$ B, K/ \+ ]2 c8 E! v1 J
  24.         )8 d- ]3 I7 M0 @! _5 v$ m, o1 U! K
  25.         BEGIN
    , R" \9 _9 ~0 b5 f9 o' O. n
  26.             SET @result = 1;
    ; v  Q4 G1 d8 V# f. J6 ?
  27.             BREAK;0 ?* G  R! B9 L) X/ R3 F
  28.         END
    " g3 _; t6 Q# [0 H
  29.         . n3 g: L" v  b9 x
  30.         SET @i = @i + 1;
    ' {6 S* s0 |% v* n2 G1 Q9 C4 b
  31.     END;7 }. t7 R9 \0 ]2 d' _' W
  32.     : q* {9 n' g4 H$ m0 x
  33.     -- 检查是否在非法名称列表中: _0 H6 V( X* B* _6 b
  34.     IF EXISTS (* a/ D# M2 f7 N! h; `. g" N! _
  35.         SELECT 1
    1 T2 l& \: E/ Q8 e0 H  q# b0 m
  36.         FROM dbo.illegal_character_names
    3 w: j- d. @' d
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    ' y! |! q, Y, T7 `! U9 P
  38.     ): M. f) n+ k0 B' e- n
  39.         SET @result = 1;
    & q8 m3 ?, a  e* o8 [1 P
  40.    
    & S! b4 W# _& t7 i+ J
  41.     RETURN @result;$ E/ H, F) G9 ~
  42. END</span>
    " R4 R9 O4 P3 C% ]; @- T- f
复制代码
插入屏蔽的字符
- o8 n! z: j& A) Y
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    # u+ S4 D5 d4 T
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');& a% ~0 m" O" X- R
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    7 Y' B9 S( p% S0 L" u1 D
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    , R; `4 v: r+ {
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
      G' x& C" {- B. M2 K
  6. ' d0 I0 v7 S% V8 I, U( v' p' d
  7. -- 示例:查询包含敏感词的角色名
    $ r  z1 S+ [- Q& U3 E% C9 a! ?  `
  8. SELECT * 9 {3 E. O- c. b, ~; n
  9. FROM dbo.characters # ]; d; s6 Q: C. N/ }: I% r; A8 y
  10. WHERE EXISTS (7 a0 R6 z& I( R$ E
  11.     SELECT 1
    + b: b3 B$ Z! V: E# H5 q
  12.     FROM dbo.illegal_character_names 9 e! D! k3 A- I
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'3 ~2 n5 m( }+ C3 I& r! C
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
  `0 J/ d$ L1 L/ l+ j原始为:. e0 p7 F/ F2 E$ I& B7 W: D4 ~
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT2 O3 Q' e5 M1 a; u% J+ M

  2. ! r# e- P4 G/ }( J( c9 l) k
  3. IF @v_ret < 0
    + \) Y1 }5 M. d# Q, d) D
  4. BEGIN
    5 w, _/ M& s7 e& ^7 G) `; _
  5. SET @sp_rtn = @v_ret
    / m0 ^2 N( n3 W; x
  6. RETURN
    : e3 G0 @' y1 {; U8 S1 t8 c
  7. END
复制代码
修改为:' O7 r0 e$ _. G8 Q' h, X; R
  1. IF (dbo.NameBlock(@character_name) = 1)
    9 }3 A3 G; ?+ u! D$ ]
  2. BEGIN0 ~; D* W& f( ~7 j
  3. SET @sp_rtn = -12
    0 M) C" U8 n: q6 X- @
  4. RETURN
    * q- M0 {" E8 E( G# v2 N4 I) e
  5. END
复制代码
) I6 A0 H3 M: B' s, x
$ V0 Z1 y; G; @' `0 b" \

7 @( c  X# g1 m3 y% X+ S

$ e% n3 k% T" P. ?7 i2 M, _
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-1-1 13:40 , Processed in 0.083759 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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