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

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

[复制链接]

150

主题

299

回帖

5277

积分

管理员

积分
5277
金钱
1689
贡献
3139
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
. G6 y4 d+ o1 N# A. N1 \% [5 y; @3 m, d  t
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数  Z1 f: y: h9 ^1 p' ?% k
  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 I3 l4 e) z- G4 G
  2.     @character_name NVARCHAR(40)" V9 p4 w! _( N2 R+ W' M- Z
  3. )
    $ d# ^0 }2 L% m0 z1 N6 t$ {
  4. RETURNS TINYINT1 {+ F% [6 e4 n2 q0 w* T
  5. AS, |/ J/ o& \) G6 `
  6. BEGIN; x' F0 X" t# S3 h
  7.     DECLARE @result TINYINT = 0;
    # ]  O  y0 n7 v1 @  L. ?
  8.     DECLARE @char NVARCHAR(1);
    0 \% G4 j" n/ F1 F) j
  9.     DECLARE @i INT = 1;
    . O  f; M! e4 _: l2 Z/ g
  10.     ( J$ W1 Z# m, y! b' f2 z% P
  11.     -- 遍历每个字符,检查是否合法
    : G9 @1 G; e+ l7 e8 U5 g
  12.     WHILE @i <= LEN(@character_name)5 s+ m3 D9 J; g
  13.     BEGIN
    & B! c! C5 z+ j- `
  14.         SET @char = SUBSTRING(@character_name, @i, 1);" l. J1 s. ?6 j: e8 W+ W' {
  15.         
    9 e6 o) R! D/ A$ ?! D2 l9 M
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号( d' s: ?- n) s& F: J
  17.         IF NOT (
    ! W! t+ {8 B0 `: B$ ]7 Z4 Z% A
  18.             -- 中文字符范围 (基本多文种平面)9 a, Y: h) U' s1 w
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR' ^8 w/ H. j' a4 j+ [
  20.             -- 英文字母和数字
    4 d- h0 p" A" B( Y  `0 E+ t! x3 D
  21.             @char LIKE '[a-zA-Z0-9]' OR2 x8 M8 Q" k6 }5 a
  22.             -- 允许的特殊符号- e7 A% E$ g! Q4 r- d0 a. [
  23.             @char LIKE '[_ -]'0 m" s3 y5 J" W4 Z
  24.         )+ n6 [8 U) V* M" \
  25.         BEGIN
    : f& Y" \8 s* V* n
  26.             SET @result = 1;
    7 B4 ~  j7 y3 H0 F; H$ ]0 I0 i
  27.             BREAK;
    ; |3 r. b3 `2 N2 L4 R
  28.         END
    / V% w4 @) d& r6 g) `
  29.         
    ; q$ ]) k( A6 R- g
  30.         SET @i = @i + 1;) M) l9 o, D! ]4 I- n* P
  31.     END;, ?  r- F$ _$ _% p
  32.     3 p. \" z6 `( q; G4 U
  33.     -- 检查是否在非法名称列表中
    . o' U% a+ S$ f4 r- G0 f3 Y/ s
  34.     IF EXISTS (
    $ g% W2 `& g- V
  35.         SELECT 1
    % Q! t8 K" g- a% q/ K! C# T: e
  36.         FROM dbo.illegal_character_names
    * a+ a+ A; [  |5 p, e
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    2 o* N! _; j" i3 V! Z
  38.     )
    $ I1 x7 @) g0 U  q3 ^* R/ F) ?
  39.         SET @result = 1;
    , S( c' q/ y0 V  _- L' G; G
  40.     $ h1 x* @, j: p# g
  41.     RETURN @result;
    * J3 t, f, G( m0 T0 Q4 V
  42. END</span>
    ! E% b0 Q; `) _2 s6 \2 o% m( _, \- z
复制代码
插入屏蔽的字符
) O' {; w1 i/ [$ C2 }. r6 w; ^, n
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    6 Z- U4 K  {% x# k. u: f, _8 O
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    & g! r0 v- \$ o
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    4 t7 s0 b5 m8 o1 A" w7 `
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');6 H" d7 r8 O3 t5 m6 O
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    8 \/ v9 e! l4 R( B- [
  6. . T5 q1 o/ E: z4 n" J$ r! c! T
  7. -- 示例:查询包含敏感词的角色名
    ( Z' H7 k, y1 c& u1 t1 |: x/ ~6 Y
  8. SELECT *
    & @  ?5 q! T1 n
  9. FROM dbo.characters
    6 A" j, L$ Q6 {5 `
  10. WHERE EXISTS (
    # C/ O1 n9 j% V5 H4 f
  11.     SELECT 1
    6 B+ `8 ]$ ^) i7 e( Z
  12.     FROM dbo.illegal_character_names 8 j+ X: C% N$ u0 ?  p/ P
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'7 j' u5 A% ?$ y- T0 j% e+ b
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据$ Y( T  q/ v" k  n9 C) a
原始为:
# y8 C2 A$ ^& ?- g0 W/ W+ t# \
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    / T% Y" ~/ @4 y. {* {9 f9 i; {$ @

  2. 1 A* l/ m9 E  i$ D
  3. IF @v_ret < 0
    & g- H4 Q0 u1 k) C
  4. BEGIN
    - N( E5 c% V* \* K
  5. SET @sp_rtn = @v_ret
    ' `  L9 i9 _; e( f, @9 ?
  6. RETURN
    5 d3 C3 n: p% j8 B5 @
  7. END
复制代码
修改为:
6 K4 F( ?5 ?, G
  1. IF (dbo.NameBlock(@character_name) = 1)
    3 b* X/ u* L7 ]% c9 G. k
  2. BEGIN
    . ?; @; u/ y( x7 W
  3. SET @sp_rtn = -12! X4 z! S+ s" S. R" p' F
  4. RETURN
    8 k7 e5 V* `1 T: b  R" W+ O; c
  5. END
复制代码
& _% j. M' \  V' S8 k

! z8 m1 G5 G8 Y. ~4 N+ _0 S- `) y' w6 \! M7 `* x, S3 z" a
+ }8 q2 a; K0 H% O3 c! t2 J
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2025-10-3 11:23 , Processed in 0.046613 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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