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

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

[复制链接]

149

主题

294

回帖

5195

积分

管理员

积分
5195
金钱
1666
贡献
3086
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
1 t1 h# [8 ?8 E' r; o+ I! Y! s
, Y. H- S8 ^% x0 S% G' Y) N1 m
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数/ `4 g+ _' L: s( l6 W& ]
  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 (
    0 B( E5 C3 F/ z
  2.     @character_name NVARCHAR(40)
    ) L! z5 ?: u5 h" r- I1 v' t8 |: p" R
  3. )
    , C1 ], g. c; D; c2 D4 _4 A) K( @7 Q  y
  4. RETURNS TINYINT7 j9 v6 K) S: V& _- s8 _% b
  5. AS
    ; u0 y  ^! m5 }+ z' A. D
  6. BEGIN
    . Z4 m8 _5 _9 ?* O
  7.     DECLARE @result TINYINT = 0;% {% A  |( x7 t
  8.     DECLARE @char NVARCHAR(1);$ \* t1 J# N2 v; T& Y
  9.     DECLARE @i INT = 1;0 s+ V! c4 L0 y" P6 [) q
  10.    
    + j7 _3 T$ e9 Q1 `# c
  11.     -- 遍历每个字符,检查是否合法
    ! `4 m' [7 E$ A. H; f5 c
  12.     WHILE @i <= LEN(@character_name)8 H1 W- M9 r/ e7 Y+ @
  13.     BEGIN+ _7 s1 s! x; x' Q
  14.         SET @char = SUBSTRING(@character_name, @i, 1);# H7 F' A$ W, o$ i6 \
  15.         " D  [3 s+ o% _1 Q9 |/ |. R
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    . q5 b7 D7 i) \# q, g
  17.         IF NOT (" m2 v% R- c1 `/ a* I! H+ z" d7 ?
  18.             -- 中文字符范围 (基本多文种平面). y$ W: [) i- {! _" R; P
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    5 x2 Y, l! x( ~. F
  20.             -- 英文字母和数字- I1 n" J# Q% |8 y1 |
  21.             @char LIKE '[a-zA-Z0-9]' OR" m1 k& @" E# ^* B3 m2 l9 s: x8 {% ], U
  22.             -- 允许的特殊符号& P  s3 X" X1 P) G
  23.             @char LIKE '[_ -]'
    9 _4 H* ]: d! f3 M% @4 s
  24.         )/ Y( I1 d' {* x4 }: Y; X
  25.         BEGIN# d# j& N. B: g1 _, }% m" e
  26.             SET @result = 1;4 i. V# g, l9 Y/ d& W9 B
  27.             BREAK;
    8 {. Q2 g* T5 k
  28.         END- B  _  c8 X+ ]* g. a$ Y( M
  29.         8 p& D2 \) E5 p1 e  ?& K) R
  30.         SET @i = @i + 1;2 n; ?# P5 ?# U  P+ u0 h1 l
  31.     END;: e/ q' O( U. l! `& Q+ p" p1 t
  32.    
    : G; b- V6 T: y; w" ^/ l$ [
  33.     -- 检查是否在非法名称列表中
    6 d) a3 O5 Y" l5 T( h3 O1 G
  34.     IF EXISTS (
    % a6 G, _' j5 y' g% L- Y! b
  35.         SELECT 1 5 z. I0 T0 O# |5 ]; \1 Z4 _: Z$ r
  36.         FROM dbo.illegal_character_names
    0 l1 `7 [! o; f3 I$ [
  37.         WHERE @character_name LIKE '%' + partial_name + '%'. [; n* x+ B7 j) O, U1 R. o& ~
  38.     )
    7 J$ E: ?- o, o7 z7 r9 w) y  X
  39.         SET @result = 1;
    ) {( \$ N6 ?* L+ C
  40.     0 m- M7 v) D9 `
  41.     RETURN @result;
    $ e" B3 a8 k; ]/ T4 ]6 F7 Z
  42. END</span># I! \" v1 I( C5 a* g
复制代码
插入屏蔽的字符
4 ~- R/ w' E1 _3 m7 X* L
  1. -- 插入非法名称列表(明确列名并使用N前缀)- B' I% \3 K! U
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    9 c8 o" F/ @' q4 Z1 S. u
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    . Z- f+ h9 L( q# t( \! x0 D
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');+ Y; a: E. N( h1 P% B
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');1 w1 b% T+ x& _; f

  6. . g9 _) P& F* ^: l9 g2 ^
  7. -- 示例:查询包含敏感词的角色名3 s7 T$ y8 S% }2 ~; I# z
  8. SELECT *
    $ S. A4 g! ~% I- f0 _
  9. FROM dbo.characters
    ! |5 t; |1 H3 U( v" s3 D, x* y$ Y
  10. WHERE EXISTS (
    4 x+ h, W: R4 b" W
  11.     SELECT 1
    ! ^2 y8 L! P( r# ~+ F4 c
  12.     FROM dbo.illegal_character_names " x3 C# d1 Q3 p. \! B- T
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    " X0 R2 R! f2 E
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据: H: e& R( M  b  j, x9 z2 h) Q5 n- \2 v
原始为:; n6 v; u- ~9 ]5 {' I3 G
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT; H, I7 U7 I, e; ^& j

  2. 9 O  \( c( L2 b6 d* b9 M3 `2 X
  3. IF @v_ret < 0 ) ^, Y5 g* m% O  I  ?7 n
  4. BEGIN
    % V6 o2 b3 ^" @+ @
  5. SET @sp_rtn = @v_ret
    : L* r! |* Q/ q  j3 l, I( d
  6. RETURN
    ' {) W5 x7 ^+ p+ l4 i5 c
  7. END
复制代码
修改为:
$ ?4 i$ a0 {' q/ r2 k6 ]
  1. IF (dbo.NameBlock(@character_name) = 1)
    ' ?5 {3 I2 V" M, ~1 p
  2. BEGIN* Z0 c3 C1 s. f
  3. SET @sp_rtn = -12% ~5 I& }# Z$ ~2 Z/ K1 H
  4. RETURN% |5 \. ^" T4 M$ p
  5. END
复制代码

  i; b$ Y6 L: B, q0 W
+ m0 P9 S& T  `/ V& x; c# i! f
1 Z' L1 o3 y/ q) H9 r
) Y/ l) b9 l3 s% ?/ `
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2025-9-19 22:22 , Processed in 0.040860 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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