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

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

[复制链接]

164

主题

407

回帖

7723

积分

管理员

积分
7723
金钱
2247
贡献
4905
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表. C8 n3 a3 R' d6 w

( g+ \: n2 V# l3 c4 S1 o/ D" w
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
7 D2 Y/ l% c3 a! ?
  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 (: v/ R) Y- a! f7 t; t9 r7 m% ~! T
  2.     @character_name NVARCHAR(40)- ~. T& J* _2 \  c6 h* d
  3. )
    : p7 G7 M$ U. c
  4. RETURNS TINYINT
    ! v0 g  _$ M, B
  5. AS3 o! J! |7 Y5 u1 T$ q0 H4 F
  6. BEGIN* W1 d: R# W) V- Q# L* y8 g0 ?5 B, r
  7.     DECLARE @result TINYINT = 0;
    9 g9 Q9 N9 z" p
  8.     DECLARE @char NVARCHAR(1);
    ! P/ d8 y: S) i: [  ^: \. y
  9.     DECLARE @i INT = 1;4 g% S8 ^( ~) w) B7 e
  10.    
    ; ~, Z( p6 i) y) U& C8 H0 |- s3 ]
  11.     -- 遍历每个字符,检查是否合法6 ?9 T9 B7 w4 |* F6 x, }
  12.     WHILE @i <= LEN(@character_name)
    % c' j" j& ?8 R# Q/ ]/ ^6 M# e
  13.     BEGIN
    ; A3 X4 S7 q# ?; e! _2 K
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    & N  i! s- L/ g4 R
  15.         
    " T0 q$ i0 C. I! }
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    ! E8 @, x5 c: Z5 J, R" q" j
  17.         IF NOT (
    5 e) y* R* e" F% D, R
  18.             -- 中文字符范围 (基本多文种平面)' I- _2 t" c; b; w& \
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    ; }, A& X+ a9 h3 B: a6 a# O
  20.             -- 英文字母和数字
    ! r$ v  N1 c7 Z5 c4 ^3 f2 s
  21.             @char LIKE '[a-zA-Z0-9]' OR2 y' i, _, m% c! F4 s- m
  22.             -- 允许的特殊符号
    0 @9 L2 i  M% q4 X) S- J
  23.             @char LIKE '[_ -]'
    ) O9 q! i2 ?  O9 z* |4 H
  24.         )' w0 Z% h+ K) r1 T7 [
  25.         BEGIN
    8 H( k+ d. c/ a
  26.             SET @result = 1;# E# A' t- E6 m
  27.             BREAK;
    7 }7 _2 b/ Y# }3 L; C; \
  28.         END9 p( h4 h# t6 u( X
  29.         
      u6 S: A6 V: ^! ~$ d
  30.         SET @i = @i + 1;
    ' d- U; ?! ~0 A. i: }
  31.     END;* i5 [+ F) `8 k5 a0 Q8 \
  32.     $ o- B6 o; q) t
  33.     -- 检查是否在非法名称列表中
    + B! p& R# ]* H0 R8 \' s: G
  34.     IF EXISTS (
    9 g& ]9 m! G2 q8 ^
  35.         SELECT 1
    5 R7 I# Z1 v  c+ {$ ]
  36.         FROM dbo.illegal_character_names
    / \5 j" [5 x! v; I
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    9 u: `0 R# ]! u: T# [* Y+ ^- F, W
  38.     )
      q0 d1 F+ a* Q% S  z8 E% d
  39.         SET @result = 1;! n& S0 Z/ p2 _* A6 C- z/ _
  40.    
    ) A! D* J( Q7 a$ [4 r
  41.     RETURN @result;
    : C/ `0 }, I' B0 v
  42. END</span>
    . ~/ Y: P; s, k" Z) ~
复制代码
插入屏蔽的字符
  x1 l* d6 g& R% i. Y
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    , d1 T6 P7 J/ N9 n) c, S" ?0 S$ R; M
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    6 n7 X' y: s! Z$ n5 q. |
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    # K& @  ]: o  F& H
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');  c2 O& U) k9 d& A/ G6 s
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    " E+ t$ E3 S" j

  6. * t* C+ B7 Y% v
  7. -- 示例:查询包含敏感词的角色名
    3 E) V; S5 J, ]6 o+ Q  J
  8. SELECT * , S5 u/ ~( V! k
  9. FROM dbo.characters
    ; B: D# ~7 D$ g- b" y
  10. WHERE EXISTS (
    * ?4 M3 t3 N* w! n1 w9 b( I
  11.     SELECT 1 $ j5 c# w4 `1 w: f8 S& Z  y
  12.     FROM dbo.illegal_character_names
    ' E- F& v$ _# E; I1 o  [9 `5 j
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    . y0 I+ n  Q! w) e$ T) ?
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据& M) q) o" V  G% R) [" n7 X
原始为:
5 E0 b9 j+ |1 _5 j
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT7 v+ K: I7 \0 j- D

  2. ( b$ a/ C( s- Q7 {+ Y' p
  3. IF @v_ret < 0
      r' ?% R: V; H* X' ^
  4. BEGIN! A; K. p4 g2 I; X. z$ X+ n
  5. SET @sp_rtn = @v_ret" |# Z; Q  q/ {+ _; N# V
  6. RETURN
    2 ^  P" x0 [8 v: y- s8 ?
  7. END
复制代码
修改为:
" Q* d7 \7 p& O: H3 e8 y. I1 O
  1. IF (dbo.NameBlock(@character_name) = 1)6 U/ o! z& _- L4 q$ B% m1 c
  2. BEGIN; j6 Q, T1 B7 P3 T0 f( b, h  y
  3. SET @sp_rtn = -12
    : [3 L: d/ p) J1 B1 {4 `3 P
  4. RETURN
    0 Z( \) i! |# B$ m
  5. END
复制代码
4 q1 A+ G6 q/ H& }' v
, Q9 f: `4 A' j" A; f! o' ]
+ J2 l! {" m% P9 g+ X) E

: u3 K  J( C" x+ f$ n
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-6-23 06:25 , Processed in 0.029357 second(s), 29 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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