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

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

[复制链接]

161

主题

389

回帖

7509

积分

管理员

积分
7509
金钱
2167
贡献
4792
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
+ u# D! C- R. A5 K9 L3 V. K0 g& {3 \) b5 l
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
6 A1 y! Y% x, G: M, Y6 D) f
  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% k( H! l- o  w  q* c6 q- c1 g9 C! q! G
  2.     @character_name NVARCHAR(40)
    $ |+ c5 U; ^8 U8 x3 i- M- V5 a/ t3 b
  3. )
    2 d- H. T2 F6 a1 q( B4 k; o
  4. RETURNS TINYINT1 H+ s4 s3 U* l+ G' M- b1 `% g
  5. AS+ n5 j; m% a' _+ r4 l, N
  6. BEGIN# |( K" f9 a' F8 R, x2 V$ O* P
  7.     DECLARE @result TINYINT = 0;$ D7 N0 `6 K% @0 V; I8 J- ]' I
  8.     DECLARE @char NVARCHAR(1);7 [+ ~7 ]7 p* i$ x
  9.     DECLARE @i INT = 1;
    5 B9 ?2 B- Z- z. s- e
  10.    
    8 ]( ~# L& [2 n" [2 @2 q: d
  11.     -- 遍历每个字符,检查是否合法
    , d) m6 R( \( E2 n) m
  12.     WHILE @i <= LEN(@character_name)
    9 D. v# i! |) I" n& }7 R( t/ S2 k
  13.     BEGIN7 k4 l$ G" c  r' X# v
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    : m; \% |8 v/ p1 B, x, }
  15.         
    6 J8 u2 G! |% P0 s
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号$ \. A( W' V" x6 L8 {/ |% g
  17.         IF NOT (
    , J+ U! _6 ]& r5 J4 A
  18.             -- 中文字符范围 (基本多文种平面)
    8 i% N6 l& y  L: _
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR- ]4 _9 |9 s9 f; Z1 @6 u* A& _* ]
  20.             -- 英文字母和数字4 y4 `8 s6 e' n$ u$ u8 X
  21.             @char LIKE '[a-zA-Z0-9]' OR% _9 m! W# H, i* C
  22.             -- 允许的特殊符号* ]8 p& b; V& T
  23.             @char LIKE '[_ -]'7 Z  ^3 S) g8 G' i# E
  24.         ): N: r1 E; ~4 A. h& o. R6 r' c
  25.         BEGIN& a8 t! f7 U8 S: k! N
  26.             SET @result = 1;# Y9 Z% }0 z( V# b$ A+ k9 {' P) W2 }
  27.             BREAK;2 [& U2 O. g' A! A7 G0 @: H- e
  28.         END! c# N' p" F- J0 o: F2 K1 s
  29.         
    . P* J- B* \; j& Q) l
  30.         SET @i = @i + 1;* o- Q. O7 B' ?2 ~5 _3 i' G1 g5 K
  31.     END;
    ( J  S% C8 O  D' w# y4 m+ {
  32.     : P6 k: `. u1 a% @6 t
  33.     -- 检查是否在非法名称列表中
    3 P4 B7 d7 O: B2 ]
  34.     IF EXISTS (* }: Z2 \* i5 b/ ^2 ?
  35.         SELECT 1
    ! i* l% M1 Q. B. G; ~8 b+ q
  36.         FROM dbo.illegal_character_names
    7 L: a& l5 W  B, B; `
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    5 g) S0 l+ I7 J
  38.     )7 M& I/ O5 |' ^" [9 ^/ \
  39.         SET @result = 1;0 @. f4 e. j) c7 I
  40.    
    : l$ l/ E# f/ J
  41.     RETURN @result;
    % p% ?, V' \& V! l+ {
  42. END</span>& Y' L  b: u9 E' v
复制代码
插入屏蔽的字符7 Q  |$ g2 X. ?) |
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    / t- F/ W3 z. x; l* U5 f3 q! I
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');  U4 v9 P- Y* @2 @/ B
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    # r" h, s  U7 O+ t
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');& n( U/ [- a9 L$ }6 D* E/ {
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');& e5 ?. b: v- _7 u
  6. 4 q- U0 ~! w8 ^1 V
  7. -- 示例:查询包含敏感词的角色名
    9 L( t9 v. i+ l+ h* C) z
  8. SELECT *
    : i' O: O7 e+ p8 N) Y7 z! s
  9. FROM dbo.characters + y" m8 K' D, ?9 q% W5 p2 A
  10. WHERE EXISTS () {" u: U, k: z$ ^. Y7 ^- T
  11.     SELECT 1
    0 U0 r4 h* g" V6 h7 J2 q% x
  12.     FROM dbo.illegal_character_names 6 P0 M2 y" ~1 v9 z8 O1 I
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'' u! K& M! B/ E5 ?( p8 A
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据; E  k: _* b$ I8 w% `9 G
原始为:
) L1 u* u5 Y4 d; G" {; K
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT7 ]) |5 k$ d6 k8 v' V
  2. 9 C2 \/ A1 h/ T1 A4 }) d2 W
  3. IF @v_ret < 0
    + s  a) G! N4 Z5 y
  4. BEGIN
    1 v7 d! t/ Y  i, }$ }5 {. B8 y
  5. SET @sp_rtn = @v_ret; ]% Y+ A8 ^6 K! t" E7 J
  6. RETURN: g: f1 c4 V# K6 P1 N, T
  7. END
复制代码
修改为:
! {4 V' K: ]) h  G7 \8 h+ j2 k
  1. IF (dbo.NameBlock(@character_name) = 1)
    . x+ T7 M5 {: g+ D1 t4 p  q
  2. BEGIN
    5 _  D' P$ e' C; Q% H* H$ `# |6 B
  3. SET @sp_rtn = -124 L$ R6 L3 C% y+ N0 D2 u: i! `
  4. RETURN
    9 _: R3 D9 V$ s: D- v2 z) P
  5. END
复制代码

' w; h; B% B& Y$ N3 T' _5 w9 Z5 p3 U/ Q
" y+ e$ n, y6 y+ c: p3 a3 m

/ a2 f+ T8 q& F' I, v0 k# w
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-5-18 20:05 , Processed in 0.061246 second(s), 28 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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