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

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

[复制链接]

155

主题

348

回帖

6179

积分

管理员

积分
6179
金钱
1868
贡献
3808
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表; t5 n! F/ e; _) B

+ D$ z3 a% j; q; e
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
( ?# [# v6 w3 j3 V8 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 (
      E* e7 k, i, @3 y7 N( k  F
  2.     @character_name NVARCHAR(40)2 q; b" q- s' w* h  \
  3. )
    ' g0 C) x! b7 f. O6 J5 I
  4. RETURNS TINYINT
    3 k6 h& a! Y7 E/ q6 A/ i1 C
  5. AS
    , ^& o$ H  j: J4 H7 |
  6. BEGIN3 X$ C3 `" c: [/ d: ?
  7.     DECLARE @result TINYINT = 0;
    ( j( X/ q" J& I6 r7 ?8 r. k
  8.     DECLARE @char NVARCHAR(1);
    * l. r! a5 k. f+ F* \& ?; z; M
  9.     DECLARE @i INT = 1;* |% w* y8 s+ H* x7 `) j
  10.    
    ( E7 g. V2 g  L! ~# |/ G! ]
  11.     -- 遍历每个字符,检查是否合法
    # @% r3 W  `+ L8 B! f$ x( U9 }& M
  12.     WHILE @i <= LEN(@character_name)7 q, `" R! ^3 z& h
  13.     BEGIN
    2 b' f0 S, m. W8 V" R  ?: g
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    / H) Q4 w5 S' o# k# f8 i  M+ Y
  15.         
    4 K$ K' b! N' Z1 ^  K
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号, }/ @# i1 @7 R$ n& N' r! e, `/ j
  17.         IF NOT (  U! }  ?; K- e9 ?  Y. v# A
  18.             -- 中文字符范围 (基本多文种平面)
    . N4 ]) p/ M% C# f  Z; M+ G. O
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    1 ]% Z7 }% L0 d$ U, C8 l# {0 b
  20.             -- 英文字母和数字/ d2 X) _' e: C3 c* X
  21.             @char LIKE '[a-zA-Z0-9]' OR
    ! \2 c; R3 X, G1 a$ g) c# r9 {0 [  X
  22.             -- 允许的特殊符号
    ) l4 L( \" s" a
  23.             @char LIKE '[_ -]'% o$ S, ]4 }$ B1 Q
  24.         )
    4 K3 O' `# P4 _6 F9 d
  25.         BEGIN
    8 E7 n. ?, o- D+ p
  26.             SET @result = 1;
    & B+ y$ E- q* s* R# ^+ ?( p0 J+ K/ k
  27.             BREAK;) h" Q, f. }4 x' n/ u
  28.         END
    1 T0 p) |5 R( t, A! t
  29.         
    ( B+ c- O/ ]8 u  [2 I& ~
  30.         SET @i = @i + 1;( t# l0 I; g! b" p% \
  31.     END;( [+ V/ S+ K- s- C" d0 |+ o" N
  32.     7 K$ W. O  R' ]* d  d
  33.     -- 检查是否在非法名称列表中: }) B6 s2 U/ I% c
  34.     IF EXISTS (
    ' }/ ^5 c% |1 `$ \
  35.         SELECT 1 2 T- o" S2 @7 V
  36.         FROM dbo.illegal_character_names 6 j- R% b4 s0 e2 b0 Z5 E0 }5 }
  37.         WHERE @character_name LIKE '%' + partial_name + '%'' T. F- S  g4 `& z
  38.     )' ]" O% A! L! Y4 u1 K+ M! \2 W0 n
  39.         SET @result = 1;! S( Z6 q7 |! J9 w1 i4 C) O* C
  40.     , |. ^8 X$ V: x$ }8 F
  41.     RETURN @result;
    + U2 i( d" D& K$ p$ G. q) k. H
  42. END</span>- G0 M0 s6 L$ ^: v' X# k
复制代码
插入屏蔽的字符
7 T% y  u; W: a) _+ ?
  1. -- 插入非法名称列表(明确列名并使用N前缀)% C5 E. }# W) |' _: d& a* T5 |& q
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');7 _! {# G0 ]( A$ H' s& d
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');, x7 B( L1 w9 |4 O- w- x7 r7 [
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    ! S8 z) _/ L$ C% G! m# h) k
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');9 ]: w! j: h2 S6 ?" R! x0 X

  6. 2 C8 o4 B% b) l( E" h. G
  7. -- 示例:查询包含敏感词的角色名1 E, ]( w! D7 E
  8. SELECT *
    # I* p2 I. F0 x$ S7 ~& O  K
  9. FROM dbo.characters 4 K5 s' B* x  [- w2 R  J% t' @3 I* A
  10. WHERE EXISTS () j$ q" N  x% K; f9 M
  11.     SELECT 1
      u  U# ~0 B. c$ Q
  12.     FROM dbo.illegal_character_names 0 Q4 m% n* r8 k& O: D
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    ' ^( ?" @; Z5 J4 W) d
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
1 X! Y4 m* c" O% o7 C* I9 U原始为:
) I1 p. T0 u% o4 P
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT8 \! ~) P( K- u. v0 I

  2. * N; m: p; {' R% d+ u0 b
  3. IF @v_ret < 0
    , V4 j4 N, Q: n: ?; R
  4. BEGIN
    - M$ ]3 ~1 }4 i( g: i- Y5 M
  5. SET @sp_rtn = @v_ret5 u+ u; @- M  D( K" I2 A
  6. RETURN
    . V2 F; j# K. ~
  7. END
复制代码
修改为:
. F, p# n: W; ~, h/ `% n" c
  1. IF (dbo.NameBlock(@character_name) = 1)! U( I0 w$ s" G% P$ A
  2. BEGIN
    * D2 H3 x2 I" C& |1 M
  3. SET @sp_rtn = -12
    4 U# Y& q' W: B
  4. RETURN
    & _3 k- K6 F* _" c, L
  5. END
复制代码
8 O) e+ V7 K! a( }/ ~' W

1 A9 h  D" V+ L. K1 P: E* v' S) z( _
& M0 [7 e- {& f1 U* x0 ^
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-1-2 01:45 , Processed in 0.099694 second(s), 26 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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