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

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

[复制链接]

161

主题

389

回帖

7476

积分

管理员

积分
7476
金钱
2161
贡献
4765
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
/ c* P0 o7 V- v5 A" e- R6 e% |$ M# @$ h- o
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
  d" O0 _9 h* s) h/ _8 b( @3 g
  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 (: M$ t! j5 t( U& |( l, f- }
  2.     @character_name NVARCHAR(40)9 A- n( ]( E7 s8 }+ A9 V6 S
  3. )
    - c% h. A! u2 _" `
  4. RETURNS TINYINT
    " X, Q6 O8 {# b' E
  5. AS' ?, c; N' H# |; W; `
  6. BEGIN5 }( I) v, M. J
  7.     DECLARE @result TINYINT = 0;  P6 z6 c3 m6 Z) ^9 @2 M" F% Z% [
  8.     DECLARE @char NVARCHAR(1);; l" K/ d7 j3 j* i; |
  9.     DECLARE @i INT = 1;+ v. Q2 |% t+ {+ [( I
  10.     ! M0 o# T  y# H/ u2 r. ?
  11.     -- 遍历每个字符,检查是否合法7 L/ t9 P8 x* e% s& o1 n: q
  12.     WHILE @i <= LEN(@character_name)
    8 h2 |7 s) ?9 C% Q
  13.     BEGIN  s1 z2 a. ?! C: ?7 B
  14.         SET @char = SUBSTRING(@character_name, @i, 1);2 A3 q0 |% Y$ P! r: q
  15.         0 ?2 E3 v. I# I9 m& n: v2 a
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号& d4 S8 p# ?6 L+ s$ v# D
  17.         IF NOT (3 w. i3 y8 ?5 y  \* {
  18.             -- 中文字符范围 (基本多文种平面)/ R9 u' Z: m/ P5 J: w
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR! z% {. Y5 M0 L
  20.             -- 英文字母和数字
    ! J* ?1 ^* b' l" I7 J7 ]- E# z
  21.             @char LIKE '[a-zA-Z0-9]' OR7 F+ P! b, M8 E  K
  22.             -- 允许的特殊符号
    $ k6 E5 O( `. |4 p. @2 Q% n
  23.             @char LIKE '[_ -]'
    8 y. v! _% }' @. {; x* O
  24.         )
    2 L* ]0 p1 E, w$ B/ y
  25.         BEGIN/ N$ o/ Q" I$ M% b: e: G5 }$ V0 P" T1 @
  26.             SET @result = 1;
    2 x1 L# ~5 C. ?/ w
  27.             BREAK;
    / E. U1 X4 [& l* N8 y. O. m
  28.         END
    1 a' h& `$ r+ l/ N: q0 v3 O( d( P
  29.         
    ) b& |  e# s  G& J1 j# P7 A. }
  30.         SET @i = @i + 1;
    . b) R* m( b4 }, z0 g
  31.     END;% p" o+ ~8 v1 E5 z
  32.    
    8 y9 L& r8 ~! @$ A, f
  33.     -- 检查是否在非法名称列表中
    * z# J; _+ f; _1 K
  34.     IF EXISTS (% g7 Y/ f/ W% x* f& |3 `- x
  35.         SELECT 1 1 H# d* W6 B- t1 t  b, n
  36.         FROM dbo.illegal_character_names
    " a( r7 |& [# ~7 P! V1 N' |/ c# N
  37.         WHERE @character_name LIKE '%' + partial_name + '%') }% V2 K: Q2 {) Z5 V! d
  38.     )
    ! u* o. V. L6 ~4 [8 u' v
  39.         SET @result = 1;
    0 O; H; D2 U( g4 P
  40.    
    ) w, a+ x" H* k" X2 N
  41.     RETURN @result;
    4 k! |7 a2 \1 k' L2 I' B* V/ r
  42. END</span>
    # c% K& d( \% i5 H& p7 P- B! `$ |
复制代码
插入屏蔽的字符
& B& h) L6 x7 K' A
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    , X8 r' @; F4 f" l0 {$ t* t# a
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');. L% a) ~3 o& t" _4 C
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');! ?5 Y2 l+ R+ v0 D
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');1 a# h6 f3 h) @) Z
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');0 X. z5 a) `! L1 h2 A/ f( R0 o
  6. " b  ~+ P( p+ R4 ?0 m
  7. -- 示例:查询包含敏感词的角色名* ?- N1 U: u) u% d7 {
  8. SELECT *   ]7 G- u; U. V: r9 J% n
  9. FROM dbo.characters
    & A) s- b& W9 n: q! d; S
  10. WHERE EXISTS (( |9 L6 X! m' u& S  n5 b4 M7 @  S
  11.     SELECT 1
    6 o' _7 O! j. p0 [
  12.     FROM dbo.illegal_character_names
    $ S6 E3 K  C$ R0 V6 F+ G
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    9 s% D4 n0 a8 |) C7 F
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据! G0 G/ T5 F  l% m; x- `( ^1 ?" P
原始为:
3 g5 E/ m5 S7 r6 x" H3 A
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    8 E  Z& j1 u* Q$ b( b- K  l
  2.   w9 c  x9 z- [. Y* L# K, ^8 I
  3. IF @v_ret < 0
    6 O" p" V4 o% [
  4. BEGIN
    - O/ u- ^0 D, G9 O1 l. p
  5. SET @sp_rtn = @v_ret
    6 f) \$ [3 E% E, }$ ?% `
  6. RETURN
    * @& F' F' h( \) h5 Y
  7. END
复制代码
修改为:
9 H3 S( d$ }$ e' m6 j# ]
  1. IF (dbo.NameBlock(@character_name) = 1)
    2 J" x" X8 Y( P2 ?3 R
  2. BEGIN0 j- x* N$ a$ e# `: @
  3. SET @sp_rtn = -128 `* j/ n; {; ^: \6 y9 X* @: k. _
  4. RETURN
    # {# D8 S; @4 F0 p6 v1 v3 W, J' d6 }
  5. END
复制代码
; X& O7 E* s* I4 r% }$ W

& [' t2 w& G$ J/ q9 e* D* c8 R& {
. x7 a5 Z, c  {/ z8 y0 k+ k
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-5-13 21:45 , Processed in 0.038411 second(s), 26 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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