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

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

[复制链接]

161

主题

389

回帖

7476

积分

管理员

积分
7476
金钱
2161
贡献
4765
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
" n) e" x7 ~: S! D( I, D0 |6 L1 _9 h; }8 E
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数- y: U  z5 _# D* N7 P6 ~! y2 Q9 r8 y
  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 (' I6 C7 x& J9 U9 V! Q, e- e" Q1 b
  2.     @character_name NVARCHAR(40)5 x: z! d" ?+ P: B$ z2 a5 `
  3. )( C  u9 t9 I4 f6 ^
  4. RETURNS TINYINT
    ! w1 S' i$ M  c3 u- B3 t1 U) U
  5. AS+ b4 m7 x! M2 y" x4 m5 q
  6. BEGIN$ H$ Q8 a7 e+ \3 u$ K; C" d3 t
  7.     DECLARE @result TINYINT = 0;7 i+ X( Z# j; x; R0 A& h( S5 a
  8.     DECLARE @char NVARCHAR(1);* j; {: q$ d0 L  V
  9.     DECLARE @i INT = 1;! s! c3 D2 a1 i6 W$ q# Q& @: o/ ^  p
  10.    
    9 t6 |' \2 R5 U$ w
  11.     -- 遍历每个字符,检查是否合法
    3 y( u- `9 \# t* q
  12.     WHILE @i <= LEN(@character_name)
    % G' J2 ?& W: {
  13.     BEGIN
    7 ?' Q3 w4 {9 p# A) K/ t5 f7 a
  14.         SET @char = SUBSTRING(@character_name, @i, 1);0 L+ S& j, V0 N' V4 {
  15.         $ I/ h, o* y% a3 m, V; E
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号: a0 {% m9 Z1 W, k
  17.         IF NOT (+ H% [+ w# M5 t1 Y8 }3 d. O7 Q
  18.             -- 中文字符范围 (基本多文种平面)
    . e- t$ p) @6 E# ^) _0 T
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR* [( A0 q) y4 R" E$ b6 ^
  20.             -- 英文字母和数字
    ' c5 }! W8 s* f3 d! N0 ^: m1 q. X
  21.             @char LIKE '[a-zA-Z0-9]' OR& p8 Z4 e0 l9 ~1 e. x  M9 |
  22.             -- 允许的特殊符号
    0 O6 Y# g) h& b5 i- H" V% M& e
  23.             @char LIKE '[_ -]'" U0 O( B! v& \- b  p8 \1 k  Y
  24.         )( d3 x. _4 v6 L0 [4 u
  25.         BEGIN  S8 b# C. p3 W2 Y' b
  26.             SET @result = 1;/ ?) Z" `7 ^6 j& q" C
  27.             BREAK;% [) n! o+ b  a
  28.         END
    % Z* r6 j- C5 n$ e9 p! @" B7 z
  29.         - g5 ~3 I$ N. O- ~: n
  30.         SET @i = @i + 1;# D7 y! j2 `4 y
  31.     END;$ r* S3 @  g2 h2 b3 K0 z: G/ D
  32.     0 X4 P. I. `, s7 i4 M- a# w. a  f' @
  33.     -- 检查是否在非法名称列表中
    # K1 E) p# e2 z" Z& l! A' Y
  34.     IF EXISTS (& ?4 c  s. E- N
  35.         SELECT 1 - T3 D" z1 J3 l' r& B
  36.         FROM dbo.illegal_character_names : |5 L: _2 z* @* W+ I
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    % `3 B1 W. y0 J( l# M
  38.     )
    % N/ ~4 c8 u  P: u) F
  39.         SET @result = 1;- u4 j5 K7 h2 E' A1 ^4 `  ?; S& n4 H8 z
  40.     3 Z% \  S1 b# A4 G+ ]1 ^  O( B' {% p
  41.     RETURN @result;
    1 V6 C8 d8 M9 C- ^
  42. END</span>% b, d: K' u; p; b+ [
复制代码
插入屏蔽的字符" ^4 x; [2 `3 a7 N7 w7 t# f
  1. -- 插入非法名称列表(明确列名并使用N前缀)7 ?" p5 h+ E% m/ U# C7 {
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');) ^) R1 R) A0 R( U
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');9 H/ k4 i  P' T2 I! R- i4 A
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');& r. P9 ~- y! x: O
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');' k' J: ^7 Q4 b

  6. : S: G8 t2 w1 \* x& L
  7. -- 示例:查询包含敏感词的角色名
    : l  u, D) M- @2 h# }
  8. SELECT *
    2 }  f; Q& x2 t8 ^# X  N
  9. FROM dbo.characters
    # E, V2 X4 V- O. c
  10. WHERE EXISTS (
    2 Y, K6 w+ v- w
  11.     SELECT 1
    : S8 A' l9 J/ g+ w4 e0 d( u6 h
  12.     FROM dbo.illegal_character_names
    8 j+ j& Y4 T) G$ H: E/ F- ]
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    * e( ~: y% M: n1 W. d% ~
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
0 k- I1 u8 {3 ?0 [原始为:# B4 E0 ~; k; P; C: `! V
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    " _2 g$ ~9 ^- l# A
  2. ; U4 ^" ^' b9 H; I& E
  3. IF @v_ret < 0
    7 B& i: l0 \3 Y5 d$ R' q) A
  4. BEGIN
    3 ]/ w( S/ F9 N5 \* |1 w$ F
  5. SET @sp_rtn = @v_ret6 c7 l  O" E! R4 k
  6. RETURN# f5 o% C6 l3 n7 ^# \
  7. END
复制代码
修改为:
+ E1 T  c. T) W7 R& D
  1. IF (dbo.NameBlock(@character_name) = 1)3 R: u3 n  [; m: T
  2. BEGIN! y# c% b7 u5 C; ^9 h3 H
  3. SET @sp_rtn = -12
    . V8 q9 h- J, D- Y. U* e
  4. RETURN' X7 \+ ^$ J6 x4 m: O. L. Y+ h
  5. END
复制代码
5 x7 A: h  F- d- {# b& Y

/ S( K5 V- S% ~; n: J5 u$ f* _9 m) @. [

1 p, W1 V( q) R* W! h3 h
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-5-14 00:19 , Processed in 0.038211 second(s), 29 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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