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

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

[复制链接]

157

主题

364

回帖

6952

积分

管理员

积分
6952
金钱
1984
贡献
4447
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表! O$ s0 |- c8 r3 L; D

  K% L& p! H4 k$ P" h
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
2 E' g6 U8 ]  Z' n5 T1 X& d/ 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. o( ?: `- ?2 v' y2 a
  2.     @character_name NVARCHAR(40)
    ! L; W/ H; j" `3 c$ [0 f
  3. )
    : L  y+ S7 l, S0 w: A( L5 C+ M
  4. RETURNS TINYINT
    $ o  q1 q. P1 i5 P8 U. F% ~
  5. AS2 f" o! V: l( ~( S
  6. BEGIN
    & ^9 f3 e- w+ M2 c0 M
  7.     DECLARE @result TINYINT = 0;
    1 q+ s: r" u) r& K6 ]1 {/ R3 y
  8.     DECLARE @char NVARCHAR(1);. ]* R+ L$ _/ F" b8 f
  9.     DECLARE @i INT = 1;/ Q  X+ z3 P/ A( Y0 Y/ T! R" a
  10.     : U  ~# ?8 @4 |" O
  11.     -- 遍历每个字符,检查是否合法. j8 V- {8 S2 E9 m
  12.     WHILE @i <= LEN(@character_name)0 U$ g# f5 C$ d
  13.     BEGIN$ q3 A9 S. g- H- P+ Q+ x" m9 {
  14.         SET @char = SUBSTRING(@character_name, @i, 1);: [  D: l# U7 F0 }3 @
  15.         
    + a" w0 j, W6 V$ r- q
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    7 i  }2 C% r+ I) b+ V- P2 G0 p
  17.         IF NOT (, j% H4 @4 p2 }
  18.             -- 中文字符范围 (基本多文种平面)" R9 i8 c% g# m# r$ w# ~% e* L
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR4 {( i7 B1 g, H
  20.             -- 英文字母和数字
    ! m* n, Q, B" v% a2 _0 M6 B
  21.             @char LIKE '[a-zA-Z0-9]' OR
    0 H# ~: z- @' v2 @
  22.             -- 允许的特殊符号3 \) g9 }( s1 G
  23.             @char LIKE '[_ -]'- c/ e  A( D5 j/ P5 }: u
  24.         )
    2 V: A( `* f2 X) @, F' P8 k; V+ M
  25.         BEGIN7 Y* Z5 o# Y0 y( O& x' Q/ j) P
  26.             SET @result = 1;# j& C2 k; V; K) @
  27.             BREAK;
    0 J# T: j5 n3 O% K
  28.         END
    $ C. ]$ E. L3 [6 Q" D
  29.         7 f: u$ Q; {" U( ~
  30.         SET @i = @i + 1;
    $ x7 P. s5 L. G0 ]
  31.     END;
    $ F+ u! [3 x( g' M& K& a; O
  32.    
    * S6 F* v" M# n: J) b
  33.     -- 检查是否在非法名称列表中
    % \$ r0 [0 v. x3 ^- L7 Q3 E
  34.     IF EXISTS (
    2 J+ B, \; I2 Y# R, ^
  35.         SELECT 1
    / {, C  z9 h# B/ k) D0 }8 q
  36.         FROM dbo.illegal_character_names
    3 I1 o+ l& j) n: `% V- X
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    0 M- T' C7 E. v* \/ a4 ^
  38.     )# H4 l1 t$ c9 Z" e( S7 t' A
  39.         SET @result = 1;) a  D' E# Q( w
  40.     6 o" }- c& K+ V. v/ [+ ]& P7 V5 o; W
  41.     RETURN @result;
    9 o" Q0 I) C7 p5 Q, V6 _
  42. END</span>
    5 f  o" ~! e  u
复制代码
插入屏蔽的字符7 \# _6 ?6 {7 `" F& q# K
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    ) T# W* s2 N. X- q. G
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');- x: B. e/ v; D2 K
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');5 Y, r* _9 ]- {# K( }$ \+ Z
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');9 O- \, z9 J9 I( x
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');+ B: Y) r5 q5 J' e: _& d

  6. . G6 H- Y6 o7 k# Q
  7. -- 示例:查询包含敏感词的角色名
    1 ^! ]& U9 g  s  i* h/ I; _
  8. SELECT * " @6 ^0 W( M6 d% m( u4 d5 }
  9. FROM dbo.characters 5 k/ E4 w, h9 d2 E! U' ?! |
  10. WHERE EXISTS (
    ! U7 D* t0 u/ A
  11.     SELECT 1
    " |) d% X% u( T( O4 I) m- c
  12.     FROM dbo.illegal_character_names
    . I# Y# u" t- j. y2 Q
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    - I4 O7 Z3 \& Z; r* }
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据: ^0 t, t2 U/ c& f' ]5 u0 I
原始为:9 b' U9 A. ], ]5 _. w
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT' e2 Y' g* q: k. }

  2. 1 j1 H# {- [0 ?6 f& v0 Y# ]+ x
  3. IF @v_ret < 0 9 z8 v" `9 y& j; w: g1 j4 i
  4. BEGIN
    , l" V6 E6 G& A; P; V
  5. SET @sp_rtn = @v_ret' m# m$ z- ^% m6 E. O: [
  6. RETURN# t! s( i( U& V  j( i9 E6 W
  7. END
复制代码
修改为:* m% D3 b( |9 B+ M7 Q) Q+ x
  1. IF (dbo.NameBlock(@character_name) = 1)
      f9 y4 K0 H/ I' C# j0 l. A: l
  2. BEGIN4 c% r9 B# O1 i1 n  {
  3. SET @sp_rtn = -12! u2 n$ ^- G/ [' ]
  4. RETURN
    4 m6 K' j- W/ d) V2 ?
  5. END
复制代码

: R' ]& v/ L& Y* ?- W2 M2 p  x6 M! D* u" V& C8 t

2 e6 P2 x' D0 Y1 W# h  i9 }
9 r' j7 P! w$ `/ ?9 Y# L' K
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-3-12 00:33 , Processed in 0.026626 second(s), 26 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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