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

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

[复制链接]

167

主题

431

回帖

8221

积分

管理员

积分
8221
金钱
2407
贡献
5216
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
3 R' i" I7 K# g6 V- B, H, J, V/ }& D0 Z* O* O' H. n, v
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
$ T# _; s8 M8 k" E+ f. i
  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 (& O3 d- |9 X) T: B+ Q2 ^" I
  2.     @character_name NVARCHAR(40)
      v$ g  u4 j0 z* ]* o
  3. ); V. E7 F& _' M) S( N. M
  4. RETURNS TINYINT8 T. m% q) q3 f( T, G) V2 l
  5. AS. I% Z4 d0 N  K1 h
  6. BEGIN- J3 @! ]' u! a" N# d
  7.     DECLARE @result TINYINT = 0;
    ' Q  f5 F7 d) w+ j
  8.     DECLARE @char NVARCHAR(1);6 b  c) o  ?9 s  s( s6 E
  9.     DECLARE @i INT = 1;2 a9 U: s, W1 k1 C
  10.     1 T) W" w, C( ^( Y* ~' L* Q
  11.     -- 遍历每个字符,检查是否合法
    2 R6 i4 t3 t) d5 Z7 ^5 N
  12.     WHILE @i <= LEN(@character_name)" [5 Z9 x  z: w9 |; E- i+ d
  13.     BEGIN9 r3 m& `. q* Q" Q% j/ {
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    % G& P# Z! G* i; d
  15.         
    / L- |2 |2 O5 G: J" }# C
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号2 l4 A5 u, r1 \0 i+ B) z: R
  17.         IF NOT (: i. T2 R  `# [: W, [# G8 J* z$ u
  18.             -- 中文字符范围 (基本多文种平面)  ?6 y4 a$ W1 G0 ]5 X
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR+ D- N! k* A/ Z  m8 }
  20.             -- 英文字母和数字
    2 S1 Q  K" y7 W7 |: _4 A% `
  21.             @char LIKE '[a-zA-Z0-9]' OR7 C6 P3 U  T! c# X$ s! G6 U
  22.             -- 允许的特殊符号
    " I) p6 {: `# X; v
  23.             @char LIKE '[_ -]'; G' w$ |0 J$ u$ i& Y* B
  24.         )' O, t; S1 F5 j: Q# Y3 d8 ?
  25.         BEGIN" M2 b+ q4 l7 b3 }/ c! ?. a% L( f$ S+ z
  26.             SET @result = 1;
    7 p5 a+ Y6 D4 q+ w
  27.             BREAK;
    : z; g3 K# A1 n2 t
  28.         END5 `7 L7 G/ ?/ X* a1 \  ?8 E
  29.         % c! T9 g4 O, `; g$ ~7 d9 F
  30.         SET @i = @i + 1;2 \. N7 u3 V" y* I' Z+ c
  31.     END;
    $ }6 d% T9 T- E$ I7 Q7 c: k1 C
  32.    
    " m- u! S' b+ N* O% S9 ]
  33.     -- 检查是否在非法名称列表中
    4 z- M2 x5 C6 x5 m) o  R$ r7 r. a
  34.     IF EXISTS (4 \0 T' v) i- ]: L
  35.         SELECT 1 ( g; D) w7 m) n" Q# w+ Q4 `
  36.         FROM dbo.illegal_character_names
    ! n, H% z: v% v3 p
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    # V. }1 \6 {. P) _( s, `
  38.     ): {- V" a% p$ ^  |' W4 M
  39.         SET @result = 1;# W) s- J+ Q$ z* I6 @! w
  40.    
    ; ?' g& U* V/ {7 d. l5 Z: D
  41.     RETURN @result;
    - R! q3 W2 d: r& j
  42. END</span>
    3 f( Y; M6 ]2 O* F- b
复制代码
插入屏蔽的字符
% _+ e9 [! b* I8 y$ D" {1 n$ T
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    9 r* H; l& P( w' i2 I
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    4 v& ]' B  \: ^: R& A( `
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');6 {2 i+ v, ?8 ~0 H( |& {: @
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    7 I& |  |# K) C9 n1 N* F
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    3 |1 F* R. U7 P7 R% W  [* T1 `

  6. . i3 L! v& t' D. a# T/ c
  7. -- 示例:查询包含敏感词的角色名6 K  c' ?8 l: y
  8. SELECT *
    7 P" T# @, H* I) g% l. Q* q
  9. FROM dbo.characters 3 B, G$ @* l. |% ~1 K$ ^, V, `
  10. WHERE EXISTS (" t/ p6 K5 X) v% f7 P1 \
  11.     SELECT 1
    ! `2 J3 u9 M) |. f& z
  12.     FROM dbo.illegal_character_names
    & ~& ~8 y* r/ O6 F* ^
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    , g+ c/ y/ g; }7 z9 c
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
6 i1 V1 j) v6 [% x1 L( |; E3 }0 Q原始为:) H# Z. ?* i* i: o% ^! ~
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT  t: s+ a3 X( |7 ~: A* L( O5 h# L+ Q

  2. & j& y. ?% I/ E! H- `2 ~
  3. IF @v_ret < 0 " l: X3 Y8 F0 L; K" d9 ~
  4. BEGIN
    - z" B7 w* z! }& X( _! H
  5. SET @sp_rtn = @v_ret) ^1 B; m; u3 a, U$ Z0 U  F
  6. RETURN
    ( @) h% |  X( @( C: Y
  7. END
复制代码
修改为:
  J3 J- l3 y9 a& @( O3 X
  1. IF (dbo.NameBlock(@character_name) = 1)
    ( d4 L$ d- B0 W+ k/ Y
  2. BEGIN
      r, v; ^3 J& w" e2 _8 l
  3. SET @sp_rtn = -12
    , ?2 U. g9 V4 v' Q% a6 I! Z
  4. RETURN
    ' V4 F* [' ]8 x1 P) ~9 x
  5. END
复制代码
& c. O0 l' l  `, ?) y

& k# k+ k" b/ [/ P3 b+ o
/ @1 T. C) ^8 x$ b
- c6 k# V3 [  c( |$ f  M
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-10-21 16:28 , Processed in 0.049573 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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