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

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

[复制链接]

147

主题

281

回帖

5125

积分

管理员

积分
5125
金钱
1637
贡献
3060
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表6 V, V: E1 e+ l% c" ?& E! N

: t( I/ L  N" k7 b1 D/ C
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数/ S: n* a: H# T- O
  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 (
    + P9 p) C% F4 p* v
  2.     @character_name NVARCHAR(40)
    7 e$ p& K% l+ u- S
  3. )2 }$ a# {2 r* w+ s8 R7 Y( F4 X
  4. RETURNS TINYINT
    # m# S0 R6 ]2 X% a
  5. AS. o% W% G$ @! y8 v+ h# T
  6. BEGIN
    * F) K+ @( W8 e; ]8 ?3 I
  7.     DECLARE @result TINYINT = 0;8 y- E% B  r3 W5 L, S. p6 e( o' Y  G
  8.     DECLARE @char NVARCHAR(1);
    8 l' i" ]2 S9 J! h
  9.     DECLARE @i INT = 1;( a: e8 e% K1 {% ^' o; k3 v
  10.    
    7 W0 c7 Q1 K1 G! M2 o  s
  11.     -- 遍历每个字符,检查是否合法; H8 g8 U7 i4 V1 E! K
  12.     WHILE @i <= LEN(@character_name)
    # t8 @% r: A9 I% i0 v; f
  13.     BEGIN/ |: [1 r, o4 k2 g8 s- V
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    " b$ b" ~6 Z% _% J+ R! u# |
  15.         
    . V# S$ Y" S6 `& v# ]$ v/ j
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号3 v) F2 {# ~; l. U! M
  17.         IF NOT (
    : C: b& K+ _/ O  {2 l
  18.             -- 中文字符范围 (基本多文种平面)9 z+ k- M# Y* O, k
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    ' \/ {. J1 Y+ u3 N) N/ k' F
  20.             -- 英文字母和数字
      Y0 I7 l# R/ z' U. m
  21.             @char LIKE '[a-zA-Z0-9]' OR
    + D: s5 P" I- i' x7 i' H
  22.             -- 允许的特殊符号- z: j. e% P/ E) M
  23.             @char LIKE '[_ -]'' V% ~; b, k" o& D! r1 X
  24.         )6 T) ~* w; q5 @: p
  25.         BEGIN
    5 G& c" {* W' S7 K$ u
  26.             SET @result = 1;
    9 R8 f+ L) o/ m3 y  ]4 r
  27.             BREAK;
    4 r$ g+ U  C5 k9 P7 n& Q
  28.         END3 k+ M$ ~5 n$ P, U
  29.         $ ?; x8 `; Q( q- _
  30.         SET @i = @i + 1;
    . X. r8 d" b6 x$ s8 h( S
  31.     END;
    $ Z- z0 C; D% A6 a
  32.    
    0 T0 x7 I  ~* k5 C5 o7 g
  33.     -- 检查是否在非法名称列表中0 D3 c7 B- b2 ~) ~+ U
  34.     IF EXISTS (
    . ?9 ~! m2 ~! L+ B& @6 B. r1 a
  35.         SELECT 1 ) _6 w8 C0 @2 ^" d0 X
  36.         FROM dbo.illegal_character_names
    9 y, Q1 D4 B- n% I) ]: g
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    % K0 i" M5 }4 K
  38.     )$ d, E0 P+ X9 u: n4 ^
  39.         SET @result = 1;
    . V. z  ]0 F* [  C) d' m
  40.    
    ! f% _+ G* m' Z+ o5 ^" C8 V
  41.     RETURN @result;
    / h% u. _1 w& R3 {6 J
  42. END</span>
    - r. y% p9 b  m8 V6 t! d% s
复制代码
插入屏蔽的字符6 i  [: ~7 O) B4 d7 n! k1 }5 x( V  K! H
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    4 L0 C/ Y& m. Y% N
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    ! X9 f* s, g% I0 \, |
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');/ O0 m* [, M) S  ~
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');4 M6 i! J/ K, H& a
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');. K9 ?* f' c( M' O' [( S5 O
  6. ( t- J/ J; B) B2 q) o
  7. -- 示例:查询包含敏感词的角色名
      \# O* h* Q3 y  T
  8. SELECT *
    & Q* l6 _4 }2 T. p( v- K! n
  9. FROM dbo.characters 6 t( x+ S9 d) L+ P4 c7 ?
  10. WHERE EXISTS (5 F/ U) t: q5 p6 H
  11.     SELECT 1
    " d! [$ [  s2 z
  12.     FROM dbo.illegal_character_names
      `9 O! `: B2 t) ]% d
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'4 G! I$ v* K6 s+ x$ a$ ~- I# i
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
& c+ z4 f* W! {$ \原始为:
+ \# u6 N; z  ]1 b4 @: s
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT+ i) T: F- f' f5 Z  z/ t) E8 v4 n
  2. , n& o" K  u+ k& b5 Y. k0 c4 p2 R
  3. IF @v_ret < 0
    ( o+ @7 D) [$ w0 E% U, s) m
  4. BEGIN4 y- U. \. s8 y
  5. SET @sp_rtn = @v_ret
    + u: k" n. W9 V- i  O3 r
  6. RETURN
    4 C; {! x& e$ O5 x1 a3 [
  7. END
复制代码
修改为:+ X4 k7 k% f& g  p. o( r; b
  1. IF (dbo.NameBlock(@character_name) = 1)
    2 B4 M+ G  b9 U4 V( C
  2. BEGIN
    * c/ i: z3 D8 b0 m
  3. SET @sp_rtn = -123 V+ x, n1 X/ e8 M5 d3 ~7 X
  4. RETURN' m" Y% d5 [9 r# k3 O
  5. END
复制代码
" B. o1 }/ m5 A/ s
" O/ t7 b+ Y; N4 ]& ]8 C; j$ e

$ E" W4 E( U( ^4 w" B, G& n9 l$ J
$ A" k$ H/ `, D' U( W% \
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|手机版|小黑屋|EGameol

GMT+8, 2025-9-11 21:56 , Processed in 0.045600 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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