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

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

[复制链接]

157

主题

367

回帖

7122

积分

管理员

积分
7122
金钱
2045
贡献
4553
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表/ P8 J3 u$ J. |
2 H) j+ y; E4 [' U
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
: E+ M3 E, ^0 o5 v8 H# L9 O) s5 ]
  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 (
    & h* T) k( F" g# W$ {1 `8 l* l
  2.     @character_name NVARCHAR(40); `* w. R7 k4 a6 O7 p9 {# A; P9 t
  3. )
    " V: ]8 E. u6 P/ `2 y
  4. RETURNS TINYINT
    ) L* j" D4 G- `$ l. p4 u1 ~* F
  5. AS8 t. d" b0 R" O' {' W0 K* r
  6. BEGIN# ~1 `/ o5 n3 n% [! |
  7.     DECLARE @result TINYINT = 0;5 m/ Q/ t7 e. z% F) A
  8.     DECLARE @char NVARCHAR(1);
    ; s0 G1 p) b( A7 q
  9.     DECLARE @i INT = 1;
    1 f" j& p4 ^3 g% c
  10.     % |4 o  w0 a) z6 t. b
  11.     -- 遍历每个字符,检查是否合法
    * W9 S, }( A+ P) D
  12.     WHILE @i <= LEN(@character_name)9 T  V1 ^* u2 n. Y9 E3 n3 j
  13.     BEGIN3 ?5 F  c+ Y) T3 v1 t% M# p( Z
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    & T5 d. P) p3 R; a. ]
  15.         
    3 E( T% ^9 w! l1 t
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号2 y) a' ~3 i# z2 O3 l3 _
  17.         IF NOT (
    ) w1 i2 }/ ?. C3 g, p/ Y
  18.             -- 中文字符范围 (基本多文种平面). }% ?9 k. C2 P; P2 X% t
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR  ]  H8 i6 P3 h( q( ?
  20.             -- 英文字母和数字
    * o, H4 J2 o* w
  21.             @char LIKE '[a-zA-Z0-9]' OR1 _! ?% _( h) G3 P% ?8 J( n
  22.             -- 允许的特殊符号
    * Y( k( G" \, K: m% Q  e
  23.             @char LIKE '[_ -]'
    3 m+ ~1 v* {! |* J
  24.         )
    ' k# L$ i4 s" v4 H! H2 @
  25.         BEGIN& J% z& J/ y3 X0 u0 ?, z. K" _# x! e
  26.             SET @result = 1;1 x* l! G( k7 Y  Q
  27.             BREAK;( f' O5 \8 T  ~/ S
  28.         END
    ) H$ i8 P/ m( T6 e! b5 p  ~4 L
  29.         - d9 u5 ^( C+ V, \2 A
  30.         SET @i = @i + 1;
    4 D# g, [' m$ T2 M
  31.     END;
    % ~' P. u) V" N( v
  32.     - m8 l* ~2 U, @+ U# j
  33.     -- 检查是否在非法名称列表中
    % z0 S" i. m: V; ]1 u+ }
  34.     IF EXISTS (3 Q- M! X; r* h- Z0 L$ y: n: x
  35.         SELECT 1
    # w3 H/ P. B# s# x0 Q: w1 W5 x
  36.         FROM dbo.illegal_character_names 1 x; x0 z  M# S' z
  37.         WHERE @character_name LIKE '%' + partial_name + '%'1 U7 {2 m( B- q: l8 ~
  38.     )
    ; I& z' C; Z: g! ^% X
  39.         SET @result = 1;
    2 u+ `4 ~6 x# w  C9 V- ^
  40.    
    0 @7 K/ l& O9 N% R! D
  41.     RETURN @result;
    - }2 a2 ]2 p+ {5 u( X# i2 T
  42. END</span>
    7 O4 ~# U% d. {- P
复制代码
插入屏蔽的字符7 ^  N+ A/ |1 f( B
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    7 Z) z/ \4 _8 J$ F1 x% J) P
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');* g; e; A' Q+ k/ {' |; y
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');% t! g8 A7 B' T/ p# x( n# b: i
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    5 G4 W" Z( h, p) b9 Q: }) @
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    3 ]8 m/ S6 o7 t! ~
  6. 3 L; G( r  U  a% k
  7. -- 示例:查询包含敏感词的角色名
    ( B$ ~& M/ [* ^) C/ A; j& g( n# O
  8. SELECT *
    ( u$ k- U2 b3 o' ]7 I
  9. FROM dbo.characters 4 A. q, W( S: U2 T% S4 Q, W
  10. WHERE EXISTS (
    2 K7 Q+ [) X  l$ a% ^
  11.     SELECT 1
    1 W! f' z& B- i- o3 [) B7 r" u4 H9 r! P
  12.     FROM dbo.illegal_character_names
    9 O9 z  k, |! u5 |; I) x7 u
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'. F4 d- |" V# A- Z6 W0 e2 T% K
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
1 B4 @$ j6 b, m3 g原始为:* U2 c" x. @3 k' x
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT/ M3 D5 ?: n# s) l
  2. * b& h3 U/ w! E
  3. IF @v_ret < 0 + }: A6 w# B( R8 ?$ J; N- G
  4. BEGIN4 t9 j. w" o7 }1 W/ S" h8 ]9 G
  5. SET @sp_rtn = @v_ret
    ' D: V! j/ g5 P
  6. RETURN) Q7 f2 K+ E3 J% L
  7. END
复制代码
修改为:
. d* M! m3 `# k# @  k! o
  1. IF (dbo.NameBlock(@character_name) = 1)
    ) n( t* @; W- z4 `2 I9 a
  2. BEGIN6 G% S: l9 |2 B
  3. SET @sp_rtn = -129 @' M! R6 T6 @/ j- w4 J$ H7 H
  4. RETURN
    : W( `* e, p6 p2 v1 A% J$ \) S+ M
  5. END
复制代码

- v! {  E; }1 q" [$ n! V  v4 v9 W7 \, s7 x. n8 w. Q. ~
3 K& q2 `1 Z, g9 o

* v; _) ~, O  j! U9 z0 Z6 Q/ a2 U( C
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-4-3 16:27 , Processed in 0.042560 second(s), 28 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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