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

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

[复制链接]

166

主题

423

回帖

8040

积分

管理员

积分
8040
金钱
2357
贡献
5094
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
9 ]  m( }% o, k/ w/ F8 @3 C6 u! n2 q8 }, }0 S& M
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
' A* B* J( |) a5 E% z. T+ V& ^, 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 (
    ' D% [* n9 k9 m" l2 J
  2.     @character_name NVARCHAR(40)/ y- d: u% z" F+ g1 |
  3. )4 @% D$ V. J. W9 r
  4. RETURNS TINYINT' V& O% r  v) T6 w5 Z- }
  5. AS
    ; u% G9 {6 @6 d* X. e* H. h0 W
  6. BEGIN8 r4 Y% ]* q7 u& v4 b6 n
  7.     DECLARE @result TINYINT = 0;
    ' @- T/ u, |  ^. H# Z
  8.     DECLARE @char NVARCHAR(1);  |3 d+ D! l6 {! D* [. }0 I- J" Z
  9.     DECLARE @i INT = 1;' m! E+ A. A9 a1 b* u# ?
  10.     ; G: J0 S/ ]& N! l( B1 q
  11.     -- 遍历每个字符,检查是否合法5 w, c+ X# Z, j1 x) j7 l- `6 A
  12.     WHILE @i <= LEN(@character_name)
    ( ~0 Z' s0 L. i: h
  13.     BEGIN
    6 s8 j/ G' o; `( w& k
  14.         SET @char = SUBSTRING(@character_name, @i, 1);8 ~: k' @/ e; |5 a4 z
  15.         
    , d' d  B& Q$ v' K$ k1 o! E; \
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号' W" u% n' W; h% j' L3 _
  17.         IF NOT (
    1 ?1 R7 X, P" i! C' m
  18.             -- 中文字符范围 (基本多文种平面)# |* q/ `# f9 E5 j, E& B
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR- e* b9 N0 A2 E: B' n# n
  20.             -- 英文字母和数字& w( m) L* ]3 }$ l. C- ^7 L
  21.             @char LIKE '[a-zA-Z0-9]' OR+ s. |0 [/ E# _6 j
  22.             -- 允许的特殊符号5 r; E, Q$ `; r: L
  23.             @char LIKE '[_ -]'+ J% z" Z) @. g' [' I
  24.         )
    * F4 B6 H$ v* n$ F# N, P
  25.         BEGIN! s  U$ b# j" O* w, }3 }+ ^. ]
  26.             SET @result = 1;" P) V" P! ^! J! _
  27.             BREAK;
    4 ]: B' u* ~# x/ b7 U" j2 x
  28.         END  q6 P, g$ s6 d# n9 R8 y
  29.           H8 S1 F1 w6 {& q! a: y) b+ Y
  30.         SET @i = @i + 1;& h; Y$ {+ K' u/ y  _( E* r5 H
  31.     END;
    ; n& r* p" k2 h4 F4 p
  32.    
    & f" H: o/ _$ }1 @6 M
  33.     -- 检查是否在非法名称列表中
    & u- T2 j- H3 v  J* u1 \
  34.     IF EXISTS (
    / z7 G7 L; q( R* t7 K
  35.         SELECT 1 , K: n  ?8 `! E6 B, I4 b' E
  36.         FROM dbo.illegal_character_names 1 J! J  k- u% p! G2 e3 m- Z
  37.         WHERE @character_name LIKE '%' + partial_name + '%'; f! }4 a0 |1 n5 J4 j' j) \
  38.     )0 [5 W' ^; @. f9 C( J* Y: z' L: n
  39.         SET @result = 1;8 K% g& H. h2 n4 S9 o- p- @
  40.     5 r# y; u$ h* l# U4 \7 f
  41.     RETURN @result;
    + f# W8 [6 x8 S! Q" w
  42. END</span>/ D- E3 o3 c+ Z4 T& y. J8 g% L1 w: d
复制代码
插入屏蔽的字符. L: r. D( M" `8 o% ^6 g
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    . [6 v8 d* W  X2 A' g
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    " K3 |% `- K, D* G5 |8 {% _
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    : h1 M8 Z8 m' V& ^" D
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    9 n! V8 }! l9 z& k1 ^5 Y: U7 }
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');) x: I! @2 {8 e) z3 p

  6. 4 H, h% T/ [" a/ @7 w% n3 P! _5 H
  7. -- 示例:查询包含敏感词的角色名0 l: @6 D# L% ?4 R/ S* e
  8. SELECT * ; l( e6 b9 g- y5 k7 u- O* M) `
  9. FROM dbo.characters $ a% s/ m4 q7 l8 u
  10. WHERE EXISTS (8 z3 B# U0 |, S
  11.     SELECT 1
    # k6 G# E) b6 O+ Y8 D
  12.     FROM dbo.illegal_character_names
    - Q9 C2 ~5 R7 {/ E* [: ]+ Y+ X
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    3 O. I  P+ w. j
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
0 I2 E) P" K( j( l  u/ K1 q0 m原始为:9 h& H: w3 w+ G+ N8 k- R  B/ U
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    % z# w5 U$ }/ o+ r

  2. ( m$ n- |" S  m- e  Y0 s
  3. IF @v_ret < 0 * V+ c3 P, T, _+ g5 c
  4. BEGIN+ X& j8 _& Y9 y' E
  5. SET @sp_rtn = @v_ret0 H( X8 Y4 T; R
  6. RETURN
      p& k! i7 ^' ^0 C
  7. END
复制代码
修改为:
6 I6 f1 O  a- L( z/ I6 Z, j
  1. IF (dbo.NameBlock(@character_name) = 1)
    7 ]$ ^( j: i4 I( K
  2. BEGIN) Y( `$ z& u& E$ X
  3. SET @sp_rtn = -12
    ; |5 Z# L6 _( P. n
  4. RETURN, p/ @& \6 Z9 I. I
  5. END
复制代码

+ t  E& S/ O- J3 l6 D; d" X% U
3 a1 f8 t  D& g# A$ W7 Z, \7 I( L+ K5 z1 O1 [; G

2 }  E. U( o: m
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-9-9 08:18 , Processed in 0.053822 second(s), 30 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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