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

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

[复制链接]

155

主题

348

回帖

6179

积分

管理员

积分
6179
金钱
1868
贡献
3808
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
/ @; i0 R1 W: k5 q
& f' D2 |+ h5 e0 [
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数! ^, q4 K5 [4 q: A$ ^. P
  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 (6 Z. `1 A6 V0 `# O1 g3 I' d
  2.     @character_name NVARCHAR(40)
    . K" V4 v6 x8 Z6 L8 Y8 w/ ]
  3. )
    : I" C; I" u3 z0 v( L; @# b7 ]
  4. RETURNS TINYINT9 T) z! T- x' ^3 D' i
  5. AS2 G0 O- j, f" c0 ?# O
  6. BEGIN
    3 n, r- B6 L' M* n
  7.     DECLARE @result TINYINT = 0;& Q' n& S' c$ i# }* C! r" M
  8.     DECLARE @char NVARCHAR(1);
    ) W6 \" D& M& W8 m/ F# {- E; }" ?! B7 v* f
  9.     DECLARE @i INT = 1;
    7 x/ Z3 h7 C; t- w
  10.    
    4 Y* O5 p3 C' `  x
  11.     -- 遍历每个字符,检查是否合法% k7 G* f9 p; F, c& _" g) ]
  12.     WHILE @i <= LEN(@character_name)
    : _; I' h$ w" t8 J7 I
  13.     BEGIN
    " U  B6 U% R/ v2 r/ u
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    0 L" x& J$ @6 X; t5 T
  15.         # Y) ^, {1 x- h0 O7 o) E: y  L/ ]
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    " Q* h  P2 D4 t; A% r
  17.         IF NOT (, P  X9 p# T/ Q( H0 G
  18.             -- 中文字符范围 (基本多文种平面)/ \2 _: e8 i9 J; Q% y8 U) y
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    6 B1 P% @) I8 f* K
  20.             -- 英文字母和数字
    ) ~2 c* O) y" ?  |2 l. f: v' o
  21.             @char LIKE '[a-zA-Z0-9]' OR7 b1 g$ S5 S3 B5 _' v3 |  i
  22.             -- 允许的特殊符号% n' \7 T9 U" b2 L
  23.             @char LIKE '[_ -]'3 c& @2 \/ G2 K$ J$ a( g* x
  24.         )
    5 O1 v" K0 o1 s( }
  25.         BEGIN
    : r4 y6 b' N+ C7 H6 y
  26.             SET @result = 1;9 Z+ U1 f2 ~/ r2 J. ]/ \2 M3 U  F
  27.             BREAK;+ T( V$ m* V$ U  S- K3 W+ j% v
  28.         END
    ( k( G) m$ n9 t8 {4 j2 Q4 c
  29.         
    9 {6 s1 w) j6 J$ |3 P
  30.         SET @i = @i + 1;, G9 Z9 c3 t! P: r) K, ]
  31.     END;
    ! p3 T4 h- O# O- Z
  32.     / d+ @# p) x% Y  z
  33.     -- 检查是否在非法名称列表中
    9 A; q+ L; K, h, ]" v6 ~' z
  34.     IF EXISTS (4 e3 \( B5 d' o! F
  35.         SELECT 1
    , U+ \  {  X* j& R) W
  36.         FROM dbo.illegal_character_names
    ( \/ D5 e- _* F2 j# j
  37.         WHERE @character_name LIKE '%' + partial_name + '%'0 B2 e: V# p% W4 R
  38.     )
    4 ?- C+ B) @$ z# y, Q  S! {) f" A
  39.         SET @result = 1;7 \! A; ^  r& ^6 I
  40.     & S! C' L" o: y; ^
  41.     RETURN @result;) h# e1 b+ M$ g6 u
  42. END</span>
    . c! m1 N# ]* {7 Z1 t
复制代码
插入屏蔽的字符
$ z+ s8 o# e2 `: J4 u
  1. -- 插入非法名称列表(明确列名并使用N前缀)$ B2 Z  ]: n6 n
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    * }# i, ?0 Z$ M
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    1 S# |% Z* I7 A3 b0 }
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');# D* J9 ]+ ]- D0 q  a
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    ; j; Y- ~. c& X# ~1 \1 F  U

  6.   R& V) j; C% B6 o1 x, }; X! o
  7. -- 示例:查询包含敏感词的角色名
    6 t8 i# ?) G+ P; x$ w* s# i* M; N
  8. SELECT * 7 ^6 a  M- D3 W& c+ l. {. G
  9. FROM dbo.characters
    / U; j6 k# @7 J: Z* S- L$ q" j
  10. WHERE EXISTS (2 \/ [" f* {3 M' Y# e7 R
  11.     SELECT 1 " D+ t) P* K, v2 b
  12.     FROM dbo.illegal_character_names ) ~9 U; s; G2 [, f1 a( f5 f( z
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'! a6 ~) ?8 l! ?$ S* g$ o( d: @
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
. t* p* Q1 V8 @原始为:" ~- f3 ^% L+ _
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT/ N& s8 }9 G" e3 r4 t9 {% h
  2. % c/ _  z  m0 _/ A6 Q9 H5 Q4 b
  3. IF @v_ret < 0
    : y0 D& `1 q, Q* G
  4. BEGIN
    ; J- d6 U4 {' ]
  5. SET @sp_rtn = @v_ret! G5 T" C4 J5 f- }: o, ?) ]; C
  6. RETURN3 F) Z0 f4 n' w, j- G
  7. END
复制代码
修改为:( Z; Z. k9 W8 U2 @; s6 C* X
  1. IF (dbo.NameBlock(@character_name) = 1)
    1 L. O1 G6 ?% i/ _+ V# q# o9 {1 |* J
  2. BEGIN4 }0 m0 C& t5 t; X8 G% p7 Q  O
  3. SET @sp_rtn = -12' m. e9 U5 r5 X' H. @0 ~3 K
  4. RETURN
    & b- Y1 V/ _" Z- l6 t
  5. END
复制代码
1 Z" N' [. [2 Y, O9 B

" S) Z; I7 N2 w* p  Y, y) V1 `# c1 P; r! O; c- G: q- Z

0 }# \4 \5 X6 c4 @
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-1-2 02:03 , Processed in 0.062041 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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