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

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

[复制链接]

157

主题

361

回帖

6821

积分

管理员

积分
6821
金钱
1939
贡献
4364
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表) ]& `0 C1 t  v' ], O0 }
, F+ t# R2 {1 M6 A9 g% P4 S) ]( e
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
. v0 o7 C  h/ ^* u9 A0 k5 ]; m
  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 (
    * L8 g- i7 B  Q* k
  2.     @character_name NVARCHAR(40)
    ! l: Y! n3 i) k1 Q
  3. )
    ) {6 [$ R" C  ]/ M! T& ~2 l
  4. RETURNS TINYINT$ x% O# r% L2 N) K% u6 m2 A
  5. AS
    + c2 w' G+ u( S0 @! Y7 R% w" [
  6. BEGIN
    ! [1 |8 z, a& V2 h  S
  7.     DECLARE @result TINYINT = 0;
    3 {. C7 T. J" S5 L5 Q
  8.     DECLARE @char NVARCHAR(1);" F: \7 ^. H! g' Q; v: x4 b
  9.     DECLARE @i INT = 1;
    0 K: o5 L$ c( u( H
  10.    
    ) Y( J9 U  u( m. U- M9 R4 |
  11.     -- 遍历每个字符,检查是否合法+ e& P) o: \& J& ~
  12.     WHILE @i <= LEN(@character_name)' J; Y- _* \( Y2 t2 U. \5 E
  13.     BEGIN/ k/ O4 O) e/ G% x8 {
  14.         SET @char = SUBSTRING(@character_name, @i, 1);$ F6 C" p' S$ W4 K6 ^( v
  15.         ! S& J  g2 K& Q
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    2 }6 ]2 q3 w* ^( ?/ Z* u
  17.         IF NOT (- c1 b( n0 ^$ p! `8 b: b- d
  18.             -- 中文字符范围 (基本多文种平面)
      x5 s" Z- |1 k; x
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    ! }3 r  x! s9 H8 Q9 V, N8 Z
  20.             -- 英文字母和数字
    " E7 G9 k" k. p3 B
  21.             @char LIKE '[a-zA-Z0-9]' OR% Y9 V, t. z$ S* K
  22.             -- 允许的特殊符号
    2 U& B& J" v3 d* \( F
  23.             @char LIKE '[_ -]'1 I, x+ d! f; a9 J
  24.         )
    ' }! ]5 _* k" L5 m$ I
  25.         BEGIN/ V( g4 w* {' w2 E6 k) ~* L' A
  26.             SET @result = 1;
    4 n$ L' [1 c. B7 Y
  27.             BREAK;
    % k- E8 a' v0 J6 S
  28.         END
    + }. q1 X/ A1 ^) K' E3 v
  29.         
    ! _  |; Q) m7 \: u+ }  q0 s8 a! D
  30.         SET @i = @i + 1;9 W5 {- a# F  y8 L4 E& h/ Z1 L1 J
  31.     END;
    " @# d+ n% H& b
  32.     # F% `+ w, P  @
  33.     -- 检查是否在非法名称列表中8 e% a) s, D* l0 @9 k/ s
  34.     IF EXISTS (
    9 Z9 w) m2 {( u1 F; X9 p5 d
  35.         SELECT 1
    5 d% f! e$ k7 |& D" t' y8 J- a2 s
  36.         FROM dbo.illegal_character_names
    : j) K* }- h7 f" o& N0 {
  37.         WHERE @character_name LIKE '%' + partial_name + '%'3 ^  P( c6 w5 i" k7 n
  38.     )
    ( U% y' f( \9 h! w) K
  39.         SET @result = 1;
    5 E% O2 u9 s% S8 Z+ p8 ]
  40.    
    / |4 s9 ?8 r* P/ I, k$ [! Y
  41.     RETURN @result;- M/ v6 o9 [5 `% u- [6 m
  42. END</span>/ h, a# M  f2 ]% e9 U
复制代码
插入屏蔽的字符
0 `; z% _+ ]0 B5 a+ u( v% [
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    2 C6 ^! U+ F' l0 n5 n0 u+ l
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    2 a% m; b' B2 n, \" N2 e/ k& I% ~
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    3 n# A% `  z0 O4 y7 u/ i" ]; M* k/ M: d
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');! Z; _& }+ m+ k' z0 l7 {1 i
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    3 F; l+ t) [) n* m9 c

  6. 8 o' y! B" O* Q
  7. -- 示例:查询包含敏感词的角色名$ B6 e2 @7 o3 e3 Q$ o8 r# f
  8. SELECT *
    6 K, n5 U0 `" d- g6 D
  9. FROM dbo.characters 4 a4 f# m+ h7 g
  10. WHERE EXISTS (- M# i6 X! u, ~9 G  v
  11.     SELECT 1   V$ |, A# o# e- u# ]
  12.     FROM dbo.illegal_character_names , z; x& o' ^7 y; U
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    # F* ~! K! G2 ?) V6 F8 E2 {
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据- b0 p+ B& W) ?% _
原始为:
3 J! z, g3 P7 r0 v7 C
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT6 x% w; o; U, ~2 R3 k4 {, A
  2. " ?" W: B. n" T  v' n3 |0 k2 z
  3. IF @v_ret < 0 / L2 u; n2 x0 i, x% ~1 l& C* s
  4. BEGIN
    7 w0 N5 R& H9 p2 ?' ?  T2 C
  5. SET @sp_rtn = @v_ret- u& r: a, g, M0 q* `
  6. RETURN) v9 p- q. L& H3 j2 }
  7. END
复制代码
修改为:
: q8 s, t& P6 t4 R) f: Y
  1. IF (dbo.NameBlock(@character_name) = 1). P9 l4 S' F3 l1 c: o. W
  2. BEGIN
    1 ^3 S6 Q" J. O: T
  3. SET @sp_rtn = -12
    * s* C4 d, i) ?1 O3 o) M3 b
  4. RETURN
    1 `& j8 q$ a" V
  5. END
复制代码
5 R, d0 q* V! U! h8 K, ^" `
) L3 V4 T4 ^, A+ Q
$ P) F8 V, ?$ ?8 u

) l7 X1 ~; B2 I3 A% G
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-2-12 07:08 , Processed in 0.065097 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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