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

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

[复制链接]

166

主题

426

回帖

8133

积分

管理员

积分
8133
金钱
2380
贡献
5161
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
- E3 E6 o1 }  x8 R$ L9 e' P7 @/ F; A6 |6 R- S# `( t
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
3 b1 b3 q' d, [1 B
  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 (
    ' Z: l, |8 T# ~3 Y! c
  2.     @character_name NVARCHAR(40)
    * M5 H5 J) i8 b9 V3 \
  3. )
    * `3 L6 t- ^$ b; c; w( Y* j" B
  4. RETURNS TINYINT7 y: g9 Q# S! D# A- @
  5. AS: {( o' ?; G; T& v# F1 O8 t
  6. BEGIN
    ( x1 d. u$ f3 j; h* A7 O* s3 U( v
  7.     DECLARE @result TINYINT = 0;
    $ t6 v# C2 l/ C) }8 o, o
  8.     DECLARE @char NVARCHAR(1);* A3 r) m4 _& h: |4 G, S7 M- m
  9.     DECLARE @i INT = 1;/ H' {7 C/ K* w/ N/ T/ t8 `
  10.    
    ; g; ^5 A: f4 b7 q4 Y
  11.     -- 遍历每个字符,检查是否合法# ~  t# F( d# X$ G+ _3 M
  12.     WHILE @i <= LEN(@character_name)5 M3 W/ d) X! s  l) {
  13.     BEGIN2 X5 p. t2 r; [4 T2 M
  14.         SET @char = SUBSTRING(@character_name, @i, 1);# D3 W& j& V9 y+ [
  15.         
    : t* v) j6 \) G* d' ]
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    - Y; D$ ?4 O3 a
  17.         IF NOT (
    . x7 {( Q' h& p1 q' x
  18.             -- 中文字符范围 (基本多文种平面)
    4 @, c  i  k2 `8 U
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR0 [8 ?4 O: e+ J% q8 e
  20.             -- 英文字母和数字* f1 F9 N  b# ^6 K* I6 ]
  21.             @char LIKE '[a-zA-Z0-9]' OR
    5 T3 h' l" z; U+ {( v
  22.             -- 允许的特殊符号3 i& S3 g3 a2 V4 f) I
  23.             @char LIKE '[_ -]'( H$ x5 d/ ?1 b# ^- ]6 _1 F
  24.         )
    , a" i' O$ y; c# ]3 f
  25.         BEGIN2 N6 k/ J4 a6 \$ F+ b& g
  26.             SET @result = 1;
    - ]! C: N* ^: e  W; A  U: L
  27.             BREAK;' [  p  L# ~* t! T
  28.         END
    / D5 g* g7 S$ I6 C" s* G% s
  29.         
    ! F1 a3 R4 l; |- V- Y
  30.         SET @i = @i + 1;+ A1 B$ Y; S; V# t
  31.     END;7 R* g* Y# v5 }. C# {, l: n
  32.     ! ^6 U1 D' R( n' b
  33.     -- 检查是否在非法名称列表中) W; \- ~: ?; r: U  c) g. Y
  34.     IF EXISTS (7 D; p. [. C1 c& B5 A5 v) v
  35.         SELECT 1
    : v. `* D8 J* U# O( }/ g5 C
  36.         FROM dbo.illegal_character_names
    9 O& w8 ]+ ]) z
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    / {: H0 P5 D- ^* E  P' q
  38.     )
    + a/ h7 w+ v: g" ^# S- {+ c
  39.         SET @result = 1;
    ' H: T; e4 @8 w8 x+ t9 N. p
  40.    
    : M0 e( S1 I5 q* W
  41.     RETURN @result;
    ' ^) `8 @+ J7 l) D. v/ ]5 A
  42. END</span>/ W2 {: x$ O9 b
复制代码
插入屏蔽的字符
6 B. j2 u, k; {) p8 M" @, w
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    8 W0 j2 v( b5 C  i8 h
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    # {$ ]" I8 @( y& \1 a) _
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');: C7 \+ k; g: f0 _: X" c
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');$ B: b! t7 j( F. t+ D$ Q5 m( v6 `) c  b
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');' |2 m' \5 ~' h. u6 G5 e/ G  m

  6. & a4 }; H7 Z2 t1 c/ t! J
  7. -- 示例:查询包含敏感词的角色名1 x) a9 E* H5 A4 Z  b( ~2 O
  8. SELECT *
    5 {1 z, N6 |6 V; M) T8 ~
  9. FROM dbo.characters
    8 V$ ]7 F& H& N- G: z' }" T
  10. WHERE EXISTS (5 W2 I( U' B1 O: [- Y  Q- Z* q' E7 n/ @
  11.     SELECT 1 $ k+ q( u# K$ m/ K+ v
  12.     FROM dbo.illegal_character_names
    ' T# R! y7 H! s2 Q
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'/ K1 J! G8 ~; @5 B' `$ |
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
4 I8 T4 e$ ^8 i原始为:
4 b& t* _* M; m; e5 H6 `
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    / O3 u( }. [( i: T  C9 b; \

  2.   |- R; w3 b8 I" \. F
  3. IF @v_ret < 0
    + }& ?0 l8 |) g4 K& L
  4. BEGIN
    ! s# d& `! E' Z5 i5 n6 e( D3 p3 w
  5. SET @sp_rtn = @v_ret
    5 i/ ^) l4 T# s* q
  6. RETURN6 a9 c% _0 s. \3 K: E
  7. END
复制代码
修改为:
4 t  d! R/ ]- u! S/ F, n0 y
  1. IF (dbo.NameBlock(@character_name) = 1)* W4 @- K8 P& X8 o- _
  2. BEGIN: \& Q5 Q. R1 [  |5 n5 p
  3. SET @sp_rtn = -128 l3 G* h4 A1 E' L
  4. RETURN! s% ]+ x& o& Z- X, m( ?( H
  5. END
复制代码

) O6 f( j5 i9 T5 Q$ X7 R
5 z% m+ Z2 I2 ^  D; d, g5 M+ q) c% S: L1 M; D# u2 G8 f

; q' O3 t" n- i
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-10-2 00:02 , Processed in 0.062708 second(s), 29 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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