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

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

[复制链接]

152

主题

325

回帖

5593

积分

管理员

积分
5593
金钱
1773
贡献
3343
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表3 j. S; R( x" {' R

2 d6 |) A) H* E: R3 A5 v+ {
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数, `* M" Y: `+ [6 |: 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 (+ j+ D& ^3 w# e" M! i
  2.     @character_name NVARCHAR(40)
    % ]' D) O: I$ r2 n" x; ^* P
  3. )
    4 O2 _: h! L  ?* D
  4. RETURNS TINYINT
      t/ m1 M% W, ^, t% L; W
  5. AS
    ! T- |( f' \% k& o% L4 V5 [3 l
  6. BEGIN
    & L! a9 F: w, e0 W7 ^
  7.     DECLARE @result TINYINT = 0;& v" p/ g/ p7 t. h, ~
  8.     DECLARE @char NVARCHAR(1);
    5 Q/ {  ^  X. t( U
  9.     DECLARE @i INT = 1;- E; ~4 m/ U. F0 m  q9 |* F
  10.    
    5 j! h8 g; G" g8 R9 F7 @
  11.     -- 遍历每个字符,检查是否合法+ ]7 C( p% }1 ^2 C; I" |
  12.     WHILE @i <= LEN(@character_name)8 |9 z! d8 ]/ V" k( S  N
  13.     BEGIN
    2 k* a6 m# X* U& I+ }. G( [2 j
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    1 U5 O$ W  U+ s# s' ?9 x
  15.         & {7 ^3 N, X4 k! Z/ G9 o
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    % h6 T  ]" s8 P( g  F7 r% |4 l; w
  17.         IF NOT (
    & O' E; i# l5 M: A! K
  18.             -- 中文字符范围 (基本多文种平面)7 E+ E, n& q5 u7 I
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR/ s# l0 \( c& Y0 }0 @  g
  20.             -- 英文字母和数字! M2 N6 P4 o+ [1 |$ M2 b& m1 t
  21.             @char LIKE '[a-zA-Z0-9]' OR) t: a* T; s+ P8 G2 G
  22.             -- 允许的特殊符号
    " {; j" Y" L8 ^7 l
  23.             @char LIKE '[_ -]'" G: F0 k% y  _) a; w
  24.         )
    ' _8 D0 B4 ^. d- Z3 s
  25.         BEGIN7 d3 {6 q7 H5 k6 C
  26.             SET @result = 1;8 A2 \2 [  t, T& Y4 B, n: V
  27.             BREAK;7 o+ R2 I  y+ l+ P, I/ s/ U" D$ C
  28.         END
    - V! K" K3 D! L; o" ?
  29.         6 A$ j$ d4 ?# d* w6 K8 y
  30.         SET @i = @i + 1;
    % \0 ]# W* B& H) l: S
  31.     END;: y* W1 }9 O; l& O& J, h) x% A8 ~
  32.     6 K" b$ _8 c5 U6 u
  33.     -- 检查是否在非法名称列表中
    ( P( f( g, G3 H; E$ `  W$ s
  34.     IF EXISTS (% G2 D/ z) Q, \1 X. @9 c
  35.         SELECT 1 * \, O% g' w' f
  36.         FROM dbo.illegal_character_names % V, Z% }2 b. Z7 P$ S
  37.         WHERE @character_name LIKE '%' + partial_name + '%'7 `" Z. q* y8 t: O
  38.     )) I) e1 z1 Y& m# }5 T- F
  39.         SET @result = 1;6 x9 v8 v2 `2 y. q8 ^8 b- b, ~
  40.    
    ( h; Q8 [/ B* h6 R2 \4 M0 Z( k3 t0 J
  41.     RETURN @result;! c$ I& T, ^7 }$ ]* H
  42. END</span>
    5 @' h/ e% B5 X- y
复制代码
插入屏蔽的字符
0 P) z4 u" ]/ T  ?! _
  1. -- 插入非法名称列表(明确列名并使用N前缀)9 x$ C; g  n7 H# e& B+ ]$ ~
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');" m! d3 M# T1 r
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    / L; p& K% i2 P1 W- w4 O. ]3 H
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');- k; f3 I; |+ `+ i" [* Y: O5 B( }! @
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    : Y! q( m* I2 l  g3 s7 z& z; e
  6. 2 t( a  ?7 k7 P. d$ `, F- w: l
  7. -- 示例:查询包含敏感词的角色名9 ^/ U! V, ?2 E- A5 L8 @0 [: r! s5 O
  8. SELECT *
    9 o$ Y% s, {4 d6 j; p
  9. FROM dbo.characters
    . p7 M8 y- f( s" ?7 W* ^' c
  10. WHERE EXISTS (
    ; `+ E. P7 L' W7 N
  11.     SELECT 1 1 G; v  m$ k. |9 l
  12.     FROM dbo.illegal_character_names
    ! l# Y6 r! A% {4 H& K
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    2 q. o' n4 N; a" v3 ?. ]: P  [* G/ K; N; ^# i
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据! J2 _% A+ p$ o* a" A3 ]
原始为:
' a' G5 ~! t; B" i9 q! w
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    " |6 t9 {! c) G5 p1 [& y/ B' Z

  2. & x3 y  b7 M2 `' Q) C$ V
  3. IF @v_ret < 0
    . `" z1 }; {+ p+ A2 k
  4. BEGIN! U9 m9 I, r6 O* c" H2 [$ [
  5. SET @sp_rtn = @v_ret
    * Y( {, J% R( B) N  A1 i( ]/ p
  6. RETURN
    * a6 q/ X; p2 a* c. L/ \
  7. END
复制代码
修改为:
  E$ j3 J+ a4 z% n
  1. IF (dbo.NameBlock(@character_name) = 1)8 S7 h, q+ ]4 p1 q
  2. BEGIN
    , |6 q" s7 b, A% q1 B" _
  3. SET @sp_rtn = -12
    , ]/ A9 L. ]( g! M+ y+ c& z
  4. RETURN
    & [0 b9 e1 S) ~5 i2 ]
  5. END
复制代码

+ h! P* h' z5 a: \0 n% m1 f/ U6 T' r9 L' ?9 u" x8 [; q2 p
. u4 p& t) G3 p- F* b& v
6 g  x7 V: T7 [% W) A$ F
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2025-11-9 01:25 , Processed in 0.044712 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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