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

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

[复制链接]

161

主题

389

回帖

7476

积分

管理员

积分
7476
金钱
2161
贡献
4765
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表1 q$ P! v& _* H0 ?: t# ?

9 v# k$ J8 B! G
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数! N0 ]; A# c) q$ i/ }
  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 (, q! _7 _+ n8 V& E* R
  2.     @character_name NVARCHAR(40)
    # D1 G# J: `, {2 Z
  3. )7 M4 Z( ^, h: Q  _
  4. RETURNS TINYINT, x7 r. u6 U; [4 A& X9 e
  5. AS9 Y/ U. b# h( f  T
  6. BEGIN* x( H/ G# l5 C2 \8 @2 Y& b
  7.     DECLARE @result TINYINT = 0;
    4 z( h5 h* l9 j' A# g+ G- L2 O
  8.     DECLARE @char NVARCHAR(1);
    1 Z( E1 K- ~" I. ^; Z( g  K
  9.     DECLARE @i INT = 1;
    & z. f# T, M- p1 J, {
  10.    
    + h( @4 D; l  p) @7 k- q3 J% l  x
  11.     -- 遍历每个字符,检查是否合法6 _" E& ]0 z% K( T0 [
  12.     WHILE @i <= LEN(@character_name)
      K2 _/ O- x9 O, C# |& N. _
  13.     BEGIN
    2 x7 P/ E, X/ ?8 F& |% l$ I. o
  14.         SET @char = SUBSTRING(@character_name, @i, 1);% u3 |0 L; j' z4 e1 b# d% _
  15.         
    1 B, [8 x6 r+ P' A4 [/ _- f( F
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号8 n3 ]( E6 p% U2 @
  17.         IF NOT (
    1 ]0 p% x: z% c
  18.             -- 中文字符范围 (基本多文种平面)4 Y2 Q! u" f# ]1 p4 Y
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR) X. w9 R* Q# e6 A; @$ ~7 Z
  20.             -- 英文字母和数字! G) z) u: o4 ^
  21.             @char LIKE '[a-zA-Z0-9]' OR* b  y" I, r8 h( U$ \* Z1 d
  22.             -- 允许的特殊符号. F; A) Z6 l/ e8 l5 Z, M
  23.             @char LIKE '[_ -]'% v2 x' R! Q3 b8 a6 T# H- I( n
  24.         )
    % a2 A: A+ r" o! q0 ]+ I% z: ]9 H
  25.         BEGIN
    9 k+ Z7 m6 p4 e& {- H: u( m! w$ E
  26.             SET @result = 1;
      a; L$ @, X( \1 a. l5 A* @
  27.             BREAK;
    7 w  U+ T, ]$ x3 W5 D4 X) V: J
  28.         END- U! q& D8 O* ~- y- L
  29.         / G) `/ K" `6 Z9 F" T) j
  30.         SET @i = @i + 1;+ `# q0 [/ v, W( H8 V" K: Y
  31.     END;2 u! R' H5 L9 I/ ?5 F0 g% X" f
  32.    
    - B% H. h2 B! r$ a3 _2 d; I( T
  33.     -- 检查是否在非法名称列表中
    * V2 {. }4 Y( s4 Y) d/ p
  34.     IF EXISTS (
    ( ?4 v0 K6 @1 q
  35.         SELECT 1 + E$ f  m( y2 n7 p" t' u5 \
  36.         FROM dbo.illegal_character_names # t" |# d5 F$ v
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    ! e. ?1 G: C6 T! e1 S$ R/ u
  38.     )% u) }6 V  i6 _, G0 U
  39.         SET @result = 1;
    ; ]" ]# D* w. R' `' G* v$ u
  40.    
    " c& }% {+ f: T7 m) H8 w0 n
  41.     RETURN @result;, r0 H6 I# u) N3 O1 d
  42. END</span>
    2 n- U/ r* p  ~  X7 _: P
复制代码
插入屏蔽的字符
- j, c9 \1 O8 P6 B- p; b5 l
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    % b. Z% i1 N8 h5 s2 T) ^
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');" w5 u* |9 [) w' N5 W
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    6 b$ D/ Y8 T. h! j3 _6 G( A
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    ( A4 n' u8 a0 W0 P7 q* m; @# S+ H  T
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    / |% z' a" q1 M# D+ Z) D  Z( K
  6. 1 c( ?/ H/ p  {9 m- t
  7. -- 示例:查询包含敏感词的角色名
    ! l% {6 Y8 }' O  h& z! i* q
  8. SELECT *
    % z9 a3 ]! W7 d# B) `  D5 l
  9. FROM dbo.characters + y2 h  d2 ^. u
  10. WHERE EXISTS (
    4 E0 R- [' v/ n0 R
  11.     SELECT 1
    $ \+ f# c' [+ M$ G
  12.     FROM dbo.illegal_character_names
    3 F+ d: D" U7 W$ d$ ]
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    - l; A+ V3 H4 y& y# A' f" a8 e
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据- Y- ?% P% ~  {' ^
原始为:
2 e' P: ~4 k! L0 [
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    4 F: J, {  p* V
  2. " \, t5 s1 U/ w# E" S5 _
  3. IF @v_ret < 0
    4 k" }" Z( o# Y, \2 y! D
  4. BEGIN& |! \& H5 S" O  H8 m/ V
  5. SET @sp_rtn = @v_ret
    ; |6 @3 q- L8 R' z; W' T  i
  6. RETURN
    $ K* B8 g7 A! j( i. t( C2 u& B" K
  7. END
复制代码
修改为:
5 Z1 @, T7 \0 Z
  1. IF (dbo.NameBlock(@character_name) = 1)
    1 t* Q; l9 N4 G
  2. BEGIN
    5 V7 k, g' m5 _8 O0 a' H
  3. SET @sp_rtn = -12
    , b% k- m" c: C$ t
  4. RETURN
    & ?0 P. k8 j4 H
  5. END
复制代码

7 v# l  L3 j5 X) u# G0 U
+ ^6 S- W( J. L- ^
  {/ o! U6 @7 J% T% g

$ ]$ r: R. Z9 @0 [8 i2 Z
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-5-13 22:23 , Processed in 0.034410 second(s), 28 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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