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

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

[复制链接]

155

主题

348

回帖

6155

积分

管理员

积分
6155
金钱
1868
贡献
3784
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
& m5 E$ `8 O$ D, l& e
; i+ a# ^7 v; i8 ~% C  |8 O
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数* `- A+ G; U3 s# N" z
  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 (
    . C, Y! W) a  U" R. g6 x
  2.     @character_name NVARCHAR(40)
    ( V( \9 O) X2 G! K
  3. )1 E! \; g6 `- R/ E5 [8 {- Y
  4. RETURNS TINYINT
    , v  U  @: W8 h, K" |, H/ K
  5. AS
    7 Z4 X' r+ Z) e! h$ W% _
  6. BEGIN1 H$ W. n3 T; z  N; n( f7 Q
  7.     DECLARE @result TINYINT = 0;, ^& _" B2 D5 A7 X* t, @, v6 x
  8.     DECLARE @char NVARCHAR(1);
    % _7 z  y  y1 G# ~" s+ x  X
  9.     DECLARE @i INT = 1;
    # p( }1 t8 }5 o6 V/ _
  10.    
    # N! h+ H  L3 X
  11.     -- 遍历每个字符,检查是否合法
    ( N2 G0 q: x% o7 W" A- K
  12.     WHILE @i <= LEN(@character_name)/ S7 {$ d% U6 H' D. Z, t$ ~
  13.     BEGIN% A8 _1 J" F% |* @3 @8 t
  14.         SET @char = SUBSTRING(@character_name, @i, 1);) \1 d/ o2 t5 j7 Y
  15.         . a7 E$ s6 g" T6 v& `
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    5 ^1 ]4 j8 k' S
  17.         IF NOT (2 S5 C7 y: F# j* I
  18.             -- 中文字符范围 (基本多文种平面)
    $ m9 C, G) y4 U9 m1 M9 k7 |
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    1 r" g& n8 l6 L$ m" F
  20.             -- 英文字母和数字
    6 I( Z% P1 v% F4 @" V+ P. p
  21.             @char LIKE '[a-zA-Z0-9]' OR
    % Y# ^" t" E7 ~" v6 _" J) n7 s$ o
  22.             -- 允许的特殊符号
    3 I% l. o5 o. P+ F
  23.             @char LIKE '[_ -]'
    * j( Z% r- e& I/ z; k
  24.         )1 y, l3 V) D9 G' s. U/ P+ V
  25.         BEGIN
    9 e& ?! {6 P/ A& c% |6 u6 P
  26.             SET @result = 1;
    1 M/ T  R5 D, @" w* K9 Z
  27.             BREAK;
    6 O$ V, e1 `4 ?0 z5 J3 S+ {( [
  28.         END4 j& J1 _# f9 d1 a9 `$ y9 a
  29.         8 N  X' k+ J6 ^% O
  30.         SET @i = @i + 1;
    1 d/ K5 P6 m+ ^1 y6 H' a9 G! \
  31.     END;
    ! u- s0 c' Q9 k9 }! \) q# V9 ^
  32.     4 D4 b$ N! x, Z" x, F3 K
  33.     -- 检查是否在非法名称列表中
    & C7 V- g, [. V3 O$ s& V
  34.     IF EXISTS (
    5 X" a; G) m9 n- D  ~6 c6 P% \
  35.         SELECT 1
      q" x$ _. D" }8 C9 G) X: i4 |8 `6 `
  36.         FROM dbo.illegal_character_names   G/ o' Z3 n' Q) K) u
  37.         WHERE @character_name LIKE '%' + partial_name + '%'! B. P- K  r0 q
  38.     )
    / K5 S0 D$ p. v$ f
  39.         SET @result = 1;) [& c4 a) a6 U) I" U' h. |1 s6 y
  40.    
    2 Y% J) _) C' c1 ?# }
  41.     RETURN @result;$ M* h) e$ g4 Q
  42. END</span>
    ; e$ g, X( k" J+ d8 P. L' j- |
复制代码
插入屏蔽的字符5 v* I8 o+ |! r
  1. -- 插入非法名称列表(明确列名并使用N前缀)$ l2 h1 n* y8 i& J: l1 o
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');/ q: N8 N4 U% ^3 d% T; b
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');9 r  S" S/ y3 R
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    4 q0 V! k; z% e+ `% J' ?
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    . W, Y) v( \7 |2 ]  N
  6. : N" X1 ~% `+ C& V& t
  7. -- 示例:查询包含敏感词的角色名
    6 q% |, H& x) ?/ g# ~; o5 d/ }
  8. SELECT *
    0 _. u0 r- ]7 m; ?; N: G" g
  9. FROM dbo.characters   j& M( \9 ^& f; X
  10. WHERE EXISTS (
    6 @6 @7 j+ q/ R. k; {" q9 K' p
  11.     SELECT 1 % m5 T. K/ ~. ]* g3 t+ z. K
  12.     FROM dbo.illegal_character_names ; e0 Z  D' W- F+ ~9 K& R
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'* k) F5 ~2 P' T; h6 M
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据7 }2 [4 _8 X& v
原始为:
6 m5 U: R% ~; T& k( O
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT( T  U2 f2 n1 k6 w: q  K% t
  2. ( i8 Z1 _5 @4 m+ ~/ _5 }
  3. IF @v_ret < 0
    5 H5 P% l2 J! t# o6 a, D
  4. BEGIN5 c# S# S8 h# V" J
  5. SET @sp_rtn = @v_ret+ r2 n9 c0 g9 B/ z8 R
  6. RETURN' W( i" J  i* P0 Q
  7. END
复制代码
修改为:+ H- A$ h- B  h$ t
  1. IF (dbo.NameBlock(@character_name) = 1)
    # n- Z, y$ b# Z8 B* M) f
  2. BEGIN5 L$ d, {% K" M
  3. SET @sp_rtn = -12
      C( r! S( m4 h) {& k
  4. RETURN
    5 d1 C6 V1 S* y! f+ B
  5. END
复制代码
& y4 j5 U: g- U+ O( F& M
* u& J; u% y1 D7 \( h6 M- j3 w1 W
. [  w4 j/ a# T7 G- X% s( j1 V

! o' i/ r& A! y3 ~
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-1-1 13:46 , Processed in 0.066757 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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