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

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

[复制链接]

157

主题

367

回帖

7119

积分

管理员

积分
7119
金钱
2043
贡献
4552
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
5 E4 t7 k* S8 U; e3 ]9 F/ ]' v) g- Q3 H' T4 E
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数, k( P  r$ c, L$ l0 T3 i1 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 (! @+ o$ L2 e; n
  2.     @character_name NVARCHAR(40)% d6 t9 N, v$ u* N6 f
  3. )( W$ a; D1 k. S: Q
  4. RETURNS TINYINT
    3 S1 g  M# U3 X; m# B& P' I
  5. AS
    4 ~  Z' M. A$ [/ h% Z
  6. BEGIN9 K0 J' u# D7 E/ I+ y; r6 r) R
  7.     DECLARE @result TINYINT = 0;6 Z) H+ h" T( W* [0 a
  8.     DECLARE @char NVARCHAR(1);; C0 v; L% E' o, ^3 r0 d
  9.     DECLARE @i INT = 1;. C3 `) t1 C( u
  10.    
    0 w) p+ w2 h1 o  x, g1 O' z
  11.     -- 遍历每个字符,检查是否合法
    $ T. y  l: ^; }! \7 j% l
  12.     WHILE @i <= LEN(@character_name)
      g2 C, E6 p& f( Y
  13.     BEGIN
    0 U$ w0 z* f! F# D0 i) P: y$ ^$ {6 ^
  14.         SET @char = SUBSTRING(@character_name, @i, 1);  @. V1 J  `- |; b" C1 Q. F
  15.         ; i. Z7 U( p) Y
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号# g: i" L, i' @, I
  17.         IF NOT (
    * M9 C* [2 z6 D: t
  18.             -- 中文字符范围 (基本多文种平面)1 B0 D5 V# e4 {* y3 n7 o6 i/ k" ]
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    ; \, w/ X+ u9 n9 z, T4 x, K( i
  20.             -- 英文字母和数字
    " c2 c' u7 }! g5 ]6 m1 q0 w
  21.             @char LIKE '[a-zA-Z0-9]' OR, [) d& }% l: D/ C
  22.             -- 允许的特殊符号( q. M, K& [- n+ g
  23.             @char LIKE '[_ -]', ]; j' J3 ~4 t8 U
  24.         ): U- C' {& o# _/ v+ A) v( o: j
  25.         BEGIN. y6 `' x6 T3 d2 ]6 ]5 c) N
  26.             SET @result = 1;* s1 N* v/ ?# R; {
  27.             BREAK;
    3 Q$ F; N4 Z$ ~" G( U6 p7 K
  28.         END
    3 t' ]8 d9 z* c% L) Q
  29.         . n% U5 P3 Y# L/ k
  30.         SET @i = @i + 1;
    8 q# S. W" `1 M  t. J$ z" q
  31.     END;" Q: M$ U- s6 e8 [( H5 S; |
  32.    
    ; k5 |/ f/ R, c& F2 ^# T  D
  33.     -- 检查是否在非法名称列表中7 n5 y1 A& c4 w
  34.     IF EXISTS (0 H* Z5 G  E  o8 G6 n, H. H7 H
  35.         SELECT 1 ) ~) h- O4 W8 @7 t
  36.         FROM dbo.illegal_character_names
    1 ^9 N8 L6 n9 L: H# Y2 M
  37.         WHERE @character_name LIKE '%' + partial_name + '%') l4 M& p/ R; e* O9 O4 N2 }- n
  38.     )# ?* L" v! ?/ B/ |  u
  39.         SET @result = 1;3 y- ?7 U* V' \" ?$ {
  40.    
    ; D8 Z/ o1 Q% U, D% q, h
  41.     RETURN @result;/ I) k% O3 i! l  E( f$ N( ^) S
  42. END</span>% e8 k# P  f5 T9 b. M. @3 I
复制代码
插入屏蔽的字符) @! B+ M; |7 y3 q5 d0 G3 ~/ M" V4 B
  1. -- 插入非法名称列表(明确列名并使用N前缀)7 Q& C8 T1 H. ~1 s4 i
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    * o( i  [8 `# D
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    : S, {  F' P( s' W
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');0 H- c6 `: d7 m% x  i* G
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    * @, K! L& U7 O$ m5 H# A# o+ E
  6. * Q( f2 r$ K$ s5 n8 {1 M0 q: Z
  7. -- 示例:查询包含敏感词的角色名
    ' c" N$ C& P% T- c6 n! ~
  8. SELECT *
    . M1 ^1 [4 j0 \- b: O5 X
  9. FROM dbo.characters - C0 w, L$ }2 s! q
  10. WHERE EXISTS (
    % Z& M6 q; }: \; u; T
  11.     SELECT 1
    ' }) }: y/ S. }1 W! t, B5 \
  12.     FROM dbo.illegal_character_names - V2 B6 t. I3 x' w# F% j
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    ! \! W5 N! \% g( n# }$ N% N, a# f" O
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
8 F! {" I) h9 F- t2 M  y/ D2 ^原始为:
) e8 b8 \: v6 o" _! R, V
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    # c6 L: K% p5 P# W

  2. * \7 [" Z6 Z1 W0 _# V7 w# C
  3. IF @v_ret < 0 0 h  n0 V: Z5 i% u5 M' J! L
  4. BEGIN
    # Z5 c- [& O; H3 c7 x
  5. SET @sp_rtn = @v_ret0 Y6 _2 R* P4 R: l! ~
  6. RETURN
    % @8 F& s) j, S# e
  7. END
复制代码
修改为:) i7 O- F, p2 v9 i6 g8 U5 k' L
  1. IF (dbo.NameBlock(@character_name) = 1)6 D1 x2 C  R" X& T6 O0 M
  2. BEGIN
    ' D" _& H0 U5 y( B- P0 b% K
  3. SET @sp_rtn = -12
    % s+ o8 s6 G/ g1 Y# e6 S
  4. RETURN
    - I2 ^$ M) y; w7 z" L6 N9 w
  5. END
复制代码
0 |) ^# U7 C& b, q- p

' }, q9 S3 E3 M$ W6 ]
5 E: k" E0 @) O! k5 A1 H

- n* w8 i$ G- ~$ x* e
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-4-3 08:21 , Processed in 0.041957 second(s), 26 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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