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

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

[复制链接]

157

主题

363

回帖

6885

积分

管理员

积分
6885
金钱
1949
贡献
4416
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
2 ?9 k" Z; m- r# D2 w1 R8 @% r) j1 ^! Z
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数' x! g1 A  a5 d4 d) x
  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 (  @: t9 ^$ S- B, P+ [9 ~
  2.     @character_name NVARCHAR(40)
    " T( L9 I) o5 ~  _) ^9 S) @
  3. )6 Q7 |& ?4 T9 w) p, v. P
  4. RETURNS TINYINT1 E; h0 Q! P  [4 F4 `4 Z! J
  5. AS
    " Y( ~1 S# \2 T# a" H, \; Y* u) R
  6. BEGIN
    5 |1 c$ n, ]8 l" a' L, F
  7.     DECLARE @result TINYINT = 0;
    0 o. c& x0 H1 x0 ?5 x! L" w" \
  8.     DECLARE @char NVARCHAR(1);9 B" O, Q; t) u+ r- f; S: i6 @5 N
  9.     DECLARE @i INT = 1;
    . E9 j7 i" N/ x, v; p1 y# R
  10.    
    + m5 _9 B9 D- o" F8 b, s! ^( [
  11.     -- 遍历每个字符,检查是否合法2 Q* ~  D2 |4 V8 i7 H
  12.     WHILE @i <= LEN(@character_name). i  L) m6 L& i# p  W4 v$ V( \
  13.     BEGIN3 i5 Y+ G" l' t4 D9 s) ~  |
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    : n0 G* W* ~- S5 ]
  15.         
    ! `: a: S, Y, j% I: ?, D
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    : U# ~/ u: M4 P0 g: i+ @$ y: h
  17.         IF NOT (
    " X# A: ^& {, L6 d2 v
  18.             -- 中文字符范围 (基本多文种平面)# }3 {7 y' g0 E3 S' n3 x
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    * R. A8 `8 @( g0 N
  20.             -- 英文字母和数字
    2 f; E1 [: `" x* d/ \5 V1 V1 q; Q
  21.             @char LIKE '[a-zA-Z0-9]' OR
    $ G6 K8 G$ E+ @: s
  22.             -- 允许的特殊符号% U. T, a7 z, X; E: A7 z- ]6 a4 k
  23.             @char LIKE '[_ -]'. j7 h( x  \/ V& P3 c# S' P
  24.         ): o; J! v0 g# j% n) c- h
  25.         BEGIN0 x. {8 e: Z/ [8 Q) D0 W
  26.             SET @result = 1;
    7 {& m: ]: H' q% R1 E8 Q7 v
  27.             BREAK;
    % E- Y" d4 n' z+ R5 O# I5 b7 V! P1 ^
  28.         END
    % \( x5 N7 J. Y* }) V
  29.         
    , i1 [" X* ~3 @/ D/ c
  30.         SET @i = @i + 1;, g% @& {  H0 ~* K
  31.     END;$ L+ \  i" B) V) ?* |) M
  32.    
    $ N* W4 ]$ c# G. \9 z$ I, N
  33.     -- 检查是否在非法名称列表中' A' x! t+ e) j' d
  34.     IF EXISTS (
    ; S) h% d0 q! z) h
  35.         SELECT 1
    5 x5 f" b4 V; ~
  36.         FROM dbo.illegal_character_names
    8 M3 h, Z: F9 C/ V0 A0 Z- q+ e
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    ! M  A& J( ?7 K& n# }* C) B. m
  38.     )
    + L. I: z9 d# x1 H6 ~1 _; f
  39.         SET @result = 1;% O' p9 D+ W$ j) r( d+ y/ W8 b& Q
  40.    
    ( k5 c  m8 r, I6 [# s
  41.     RETURN @result;
    9 G7 s7 g7 \/ l' L5 d( y
  42. END</span>
    3 O8 n2 U7 r, u/ p1 K3 s2 }& p
复制代码
插入屏蔽的字符
/ _5 `8 Q" Q0 k
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    : x, l0 l1 `- T3 V; f7 b% i7 x
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    1 g& Q* f/ o+ i) A1 A0 ~
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    * ^+ T$ `. T- o  L# I$ D
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');1 Y- q9 ~$ y! |; @
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');( ~0 }+ @( v7 K/ m  \, U( C9 T" Z

  6. . r2 q% c; h6 h! P/ f! I
  7. -- 示例:查询包含敏感词的角色名
    % ]! n  q6 f( g+ Q, T# a7 W3 A
  8. SELECT * ' E' t4 i) e7 A, s
  9. FROM dbo.characters 1 \$ }! X6 p7 V
  10. WHERE EXISTS (+ ^5 I4 Z1 B6 w5 A
  11.     SELECT 1 / f6 e) Z, B4 ]9 l" @4 C# g0 |
  12.     FROM dbo.illegal_character_names
    ' N! T  Z4 l; Q0 v7 Y5 E, {
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%', j2 P, E1 x: K6 o
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
$ A4 t# k5 T( q% z+ Z' J2 [原始为:
. z0 W/ N9 U# P+ z' X% d6 R$ E
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    3 `, w% L$ R2 ^
  2. : _1 V. v2 @1 @! w$ J$ E
  3. IF @v_ret < 0
    , L. S5 Q0 H- `- u4 `# j& y
  4. BEGIN
    ( A( D+ [. C# j% R. f4 C
  5. SET @sp_rtn = @v_ret
    3 d/ f5 L* ~# t( s! L6 v% n2 f* ~" b
  6. RETURN
    ) k! O1 O. Y5 i
  7. END
复制代码
修改为:
# G( A4 k. S  f' C
  1. IF (dbo.NameBlock(@character_name) = 1)
    & j5 }* D3 c1 i8 `$ V
  2. BEGIN! p1 ^% W! z5 e: A2 G3 @
  3. SET @sp_rtn = -12* J! l( F$ s/ ^& R# L& M4 m
  4. RETURN* x; A9 u. ~; V% S  p$ W. N7 J
  5. END
复制代码

* N% u. {8 h6 n3 P% d7 C) [! ]

' `2 O& \9 K0 @2 \; Y. n+ _
  U( H' C6 U& [8 N  ^
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-2-24 11:16 , Processed in 0.048418 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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