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

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

[复制链接]

149

主题

294

回帖

5195

积分

管理员

积分
5195
金钱
1666
贡献
3086
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表* d  m! Q4 U0 W* T/ ^; N

1 D9 b% I/ I) i4 d0 Y. W) s; E& y
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
+ J9 S6 u! Q: s
  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 (8 K8 m9 \5 e* J( m, Z3 t6 K
  2.     @character_name NVARCHAR(40)$ E- i, e7 n# n, V; t0 b
  3. )
    7 N* K/ Y/ q% G
  4. RETURNS TINYINT, m9 y+ G1 u1 Q4 V& v
  5. AS
    ) j9 F) n  K* ~% X; M* N
  6. BEGIN
    ' O* `. [4 f& ~
  7.     DECLARE @result TINYINT = 0;
      M7 r# J: {! f0 a( z6 g
  8.     DECLARE @char NVARCHAR(1);
    + ^# r% d. _. k! Y" v* B2 |4 Q) @7 R
  9.     DECLARE @i INT = 1;
    ) C8 @5 T  k: h8 i( L" D- }: r
  10.     ! a3 S7 H% v! F6 l/ l
  11.     -- 遍历每个字符,检查是否合法
    ; B1 O- @" e& B2 ^/ c
  12.     WHILE @i <= LEN(@character_name)4 v- ?5 W& R' G+ R
  13.     BEGIN
    + @* k# l* l% `9 V, a/ i. y
  14.         SET @char = SUBSTRING(@character_name, @i, 1);! `- b- h3 D' s) b, D8 X
  15.         
    ' _+ r5 ~, Q6 [1 o
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    7 u8 j6 v% j4 L2 [* {
  17.         IF NOT (
    8 ~/ D1 b# _8 _/ I) c, a
  18.             -- 中文字符范围 (基本多文种平面)6 t& k; C7 N  r( G; d9 K# P0 r, S0 {5 A
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    ' B: l0 {/ O3 A
  20.             -- 英文字母和数字
    : }' l9 K, k5 I
  21.             @char LIKE '[a-zA-Z0-9]' OR/ i$ D  \9 x# d1 x
  22.             -- 允许的特殊符号: g+ h) `) b1 s+ [7 p
  23.             @char LIKE '[_ -]'! x/ ~8 t5 J+ i5 w# d
  24.         )
    3 ]) I, _/ @. }% S3 L& b7 L/ F
  25.         BEGIN4 R+ f) J) Y: Y" u/ {% K* E
  26.             SET @result = 1;% i9 E" L7 C9 c" X" {& T
  27.             BREAK;8 k' O7 V( w9 M" h" Y
  28.         END
    1 M7 N* z7 _5 F1 t
  29.         
      i! U: Y# O" ~' m" o
  30.         SET @i = @i + 1;* [. r( b3 R- z$ V* d& k7 p
  31.     END;
    8 }" l( K  h+ |3 x, S# @
  32.    
    , N1 B0 D% c, o5 k) ^
  33.     -- 检查是否在非法名称列表中' z$ ]2 k4 p2 D" ?& h. c& C
  34.     IF EXISTS (
    ! I  i  S/ K- Q; e6 Z
  35.         SELECT 1 7 V, G" X5 A! l& X
  36.         FROM dbo.illegal_character_names 4 i+ Q9 P' E8 U
  37.         WHERE @character_name LIKE '%' + partial_name + '%'9 C# R9 |* G$ y6 `# [4 w
  38.     )$ s* }0 L$ o: m$ L- ?
  39.         SET @result = 1;* N% j3 \- t, I  T: z* h
  40.    
    ! k$ O) _% l# a* h! k( N0 l
  41.     RETURN @result;
    " E, `& l) J2 z
  42. END</span>
    ( C. [1 J9 w5 a
复制代码
插入屏蔽的字符
: k) S( {' |! I- t4 _" S) }$ B8 o
  1. -- 插入非法名称列表(明确列名并使用N前缀)' W' |6 u2 Y: Q# J) n9 o2 G7 s
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    / J) y8 P2 I, I1 G
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    7 T4 d3 ?  V8 B0 G
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    5 s6 D0 L: y% `: V0 L* ~# I
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    6 w# N, V: a# U

  6. : V% Z2 j# W. A+ l( X
  7. -- 示例:查询包含敏感词的角色名7 @) e5 h2 H2 X: A  @. x+ l
  8. SELECT *
    % k  ~; C1 A7 j: f
  9. FROM dbo.characters
      o) U) b( k. c8 R1 {
  10. WHERE EXISTS ($ X7 s6 n/ a/ g9 N
  11.     SELECT 1
    7 s3 }/ V0 E; }+ K% a- I7 o! p5 ^
  12.     FROM dbo.illegal_character_names 2 d8 v/ w# w8 S2 {! c- n) p
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    ; s- Z! N/ }, ?0 c
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
# I1 |  f8 D5 d; T+ X- E原始为:
9 T( ?+ W( R3 l9 n5 E
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    7 U, D" b. v) m2 l0 |9 a$ I
  2. . X9 L. y0 Y6 }  F# |  t5 m- S+ |
  3. IF @v_ret < 0
    # z2 g$ F* y$ s; p
  4. BEGIN
    " E% h1 e" k  N8 w! k- {$ i8 v
  5. SET @sp_rtn = @v_ret
    & w$ v  n! N0 v7 |- @) r8 I: `1 N
  6. RETURN
    ' Y, P0 Q; O5 t6 P4 n+ S0 O
  7. END
复制代码
修改为:9 L& ?; q, w$ m* u& v3 x" k
  1. IF (dbo.NameBlock(@character_name) = 1)5 J( Z+ j8 x4 p1 Y4 G
  2. BEGIN( b/ ?- {5 d# t* R% H
  3. SET @sp_rtn = -12" ]7 }9 p1 ^% V& F7 C; e
  4. RETURN
    4 w( h( x, B# |( r8 q
  5. END
复制代码

+ E- m% @% x$ e3 j' l* o) X# N
) ]. _  o5 ?" q$ Q
+ s, o) P& V, S

$ o+ I9 t6 c: g
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2025-9-19 22:15 , Processed in 0.041889 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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