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

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

[复制链接]

167

主题

431

回帖

8419

积分

管理员

积分
8419
金钱
2427
贡献
5394
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
6 W( U" t# |! a, \8 d
' q( y! T! C% K) I3 r
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
! @2 f% J3 O7 x4 B
  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 (* s! p( H3 p) g  q* p! y1 j
  2.     @character_name NVARCHAR(40)
    $ L' W. K1 \( k/ w! s; R: w
  3. )
    # n3 l; t  @; `" Q7 c
  4. RETURNS TINYINT
    ) `/ ~; G! r6 H7 v% v- W
  5. AS
    . q' t+ u9 ?+ j. u4 D' G, L5 R
  6. BEGIN2 @3 q/ v1 K' q% f3 n; ]$ W  m
  7.     DECLARE @result TINYINT = 0;6 A% ^( B* l9 L; P: h) R* v/ G
  8.     DECLARE @char NVARCHAR(1);0 z7 f( c' H; f" F9 B: W+ o
  9.     DECLARE @i INT = 1;
    7 ^5 _. F/ p' r1 m( j4 K, B# e
  10.       e: a- @/ d5 T
  11.     -- 遍历每个字符,检查是否合法
    6 }' B  h. m$ c7 q: c+ @
  12.     WHILE @i <= LEN(@character_name)
    " R7 z7 J5 I' S2 w, V
  13.     BEGIN7 I; L& c5 ~& \1 ?( Q: O/ Q
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    + D2 d0 C( l# o) f! i
  15.         ; {6 W1 o( o0 J" C  X
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    : q5 S, }5 Z8 ]4 J
  17.         IF NOT (
    " S% X; {& B- A, r5 o
  18.             -- 中文字符范围 (基本多文种平面)- n4 q# C2 c4 j" u
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    ( y: i6 f# G  L) K
  20.             -- 英文字母和数字3 ^/ Z: u3 d/ x3 q/ e5 v; p
  21.             @char LIKE '[a-zA-Z0-9]' OR
    8 j3 Z- x+ u) v8 \8 M
  22.             -- 允许的特殊符号4 V& L/ K8 f5 l; N& U) N; A) c/ v
  23.             @char LIKE '[_ -]'
    5 t+ I- O. B( Q. ?1 {4 a. r+ P
  24.         )
      h, h5 s/ l( G$ e# ]
  25.         BEGIN, S0 b- W# B# C& K0 K& a0 Y
  26.             SET @result = 1;; m9 M! V- e" f" W. B) m
  27.             BREAK;* L) W9 Y' G/ d1 Q
  28.         END" C4 I# C' n3 _+ [1 u+ w$ O$ }
  29.         
    9 g" `6 {* R- c
  30.         SET @i = @i + 1;1 O% H& ~) B3 D- \3 d
  31.     END;
    & l$ n% D6 [# y! u7 f/ j! c$ g
  32.    
    ; V5 P% O6 \/ ]& G3 H) C  _5 K
  33.     -- 检查是否在非法名称列表中& L2 S0 L2 c' e; B) z! v( k  [
  34.     IF EXISTS (
    . ^6 S' i% D* S
  35.         SELECT 1
    % A% s: @$ Q& `
  36.         FROM dbo.illegal_character_names " Z5 s9 t: |9 _+ ]0 B, M# v# Z
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    / C, U. Y$ b6 i% T* s+ t! Y4 Y
  38.     )1 f* B7 b) O+ n  X6 J& X+ V4 d
  39.         SET @result = 1;
    # o' Y! e1 s5 ~- @
  40.     ) h/ f' I5 r! _1 @! J
  41.     RETURN @result;
    6 t5 A' [7 D  \& ?' ~
  42. END</span>
    % U: w$ `# x7 V1 E; W$ p# K
复制代码
插入屏蔽的字符' h/ l8 T% ]7 d# }* }% d
  1. -- 插入非法名称列表(明确列名并使用N前缀)$ R: e% I  l7 `2 u/ H) w- u& ~
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    4 J7 r0 Q) p# I3 [) W
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    / h+ z6 Z+ j. q; Y% U
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');3 E6 j. X* R% a
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    & [. s5 l# S$ Z$ G' }8 ~

  6. 0 @& \5 ~2 L# U3 h7 b8 e! u) F6 u
  7. -- 示例:查询包含敏感词的角色名
    8 T0 m: X7 V9 @3 d- h
  8. SELECT * 2 s; [4 F9 T3 t1 L- b2 _
  9. FROM dbo.characters
    . }% D3 J9 f. f6 @9 R
  10. WHERE EXISTS (7 L9 H& T; M9 f
  11.     SELECT 1
    # L7 v5 }% V( D( _, Q. i: @
  12.     FROM dbo.illegal_character_names # b. t, a: B* X  Z  F/ k3 \
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    3 l4 b) l% W% E( |. c
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据! r$ `' ?- w: j, J5 ]
原始为:' r- D+ ~2 f4 s1 R& `& p6 f
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT& f) l( C/ L0 G$ Q7 g

  2. 0 X, @# t0 Z% J
  3. IF @v_ret < 0
    / ^2 J8 f4 d* M: t/ H8 C& G
  4. BEGIN. o9 [- i8 r2 Z8 O/ ?
  5. SET @sp_rtn = @v_ret
    ' F. A+ E) |' |1 L
  6. RETURN) |8 Q& ]' o6 z" V" R' T5 C
  7. END
复制代码
修改为:
4 h1 Q- e4 v3 o- t( @: s; n% [7 _
  1. IF (dbo.NameBlock(@character_name) = 1)4 `3 U* W/ }; A1 ]
  2. BEGIN  X' P8 c" h8 A8 d: R/ x/ _7 V( s
  3. SET @sp_rtn = -12! ?' k$ @( y1 A, b
  4. RETURN
    4 A/ ]3 N* @; s- \+ P: d9 h5 |- |/ g% m
  5. END
复制代码
1 ?! G5 T' g$ }* b
" B, z! m) F) W7 |7 H

* m# P+ ?" [( W- R* @# ~: l
) U. x! C) }- i. }; A
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-11-10 20:39 , Processed in 0.378000 second(s), 29 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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