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

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

[复制链接]

164

主题

416

回帖

7823

积分

管理员

积分
7823
金钱
2284
贡献
4959
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
* h3 J% d4 w; Y3 C  C0 Q7 x6 E8 Z& N3 W. m; L
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
$ x- T& f- ~/ A! }6 P& m9 A9 M6 O. 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 (
    * o& }" w. n* I/ D( l0 N
  2.     @character_name NVARCHAR(40)6 _) o$ d/ @( Y7 [- g2 q
  3. )% ?8 g3 ~; q5 U5 m8 U0 W
  4. RETURNS TINYINT% ]" {% M4 \- N$ Y/ U, V& v
  5. AS0 o3 n+ _! d/ R+ R( j
  6. BEGIN8 M( J" T! q* D: X* i+ [
  7.     DECLARE @result TINYINT = 0;
    & r* z# M* Z4 E! u+ R
  8.     DECLARE @char NVARCHAR(1);# u- E; e: U! q4 l! s
  9.     DECLARE @i INT = 1;, w, S. P0 j8 V  y; ~4 c7 Q
  10.    
    + _6 @  }% c+ f2 p
  11.     -- 遍历每个字符,检查是否合法
    0 ~$ Q) S& L( T% X4 _8 @/ X
  12.     WHILE @i <= LEN(@character_name)
    3 G7 C! I  ~$ z1 E: A; q
  13.     BEGIN
    ; I7 N' i5 Q: A1 A$ f
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    ( y3 D- o7 {  C' I
  15.         
    1 e2 P. }, T1 W  }
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    + t$ V$ L: U5 Y; N8 q6 V0 J
  17.         IF NOT (! n1 [/ G3 N. g9 T4 }
  18.             -- 中文字符范围 (基本多文种平面)7 F# `  F9 M8 W& `4 j" H, ]
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR- b1 o# l3 N6 v
  20.             -- 英文字母和数字( [1 @# B1 I; u; Y- s
  21.             @char LIKE '[a-zA-Z0-9]' OR
    3 T9 O) D1 Y1 _3 h! P+ ?
  22.             -- 允许的特殊符号5 w6 A2 x7 i* Q( G2 F
  23.             @char LIKE '[_ -]'
    # R$ F5 d2 [$ G, T
  24.         )
    ) ^5 |2 d4 E  E: C8 b, _
  25.         BEGIN
    , Y6 B: D$ V% E/ K0 G: N
  26.             SET @result = 1;3 N8 l* a2 G# q! t* M
  27.             BREAK;
    & }! a& a, o. V. ~4 @! k8 z
  28.         END, q, {4 I& i9 L# D/ F: }
  29.         ) V% e; a9 E0 u9 j1 R3 W5 N' B
  30.         SET @i = @i + 1;8 b8 ?' z, Z6 e9 R
  31.     END;' K% L# i, f2 @
  32.     4 m- M* J; [# ^7 W; f! ^
  33.     -- 检查是否在非法名称列表中
      s9 p. j% w( I4 T( _  S
  34.     IF EXISTS (- i6 Z: s2 d7 |7 `- s' j8 p$ a
  35.         SELECT 1 ; b0 g# \# Q% k: G; {7 P
  36.         FROM dbo.illegal_character_names ) X$ a! p3 z* s, m) D
  37.         WHERE @character_name LIKE '%' + partial_name + '%'' {$ M+ j' X$ H3 ^" e* W3 |
  38.     )
    0 T0 t9 ]3 |7 u* Y& w
  39.         SET @result = 1;
    - X! w. t& K+ A- Q; G( N" M4 P
  40.     & P" g+ S3 r1 I. L
  41.     RETURN @result;
    7 B- V& n# o' ?5 E
  42. END</span>
    ) w1 S, l: U" k. P: a
复制代码
插入屏蔽的字符2 p) c: G5 [9 Z5 x! K
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    5 d7 C. j* R; P3 ]) G
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');% o8 s6 V# L# \. N* [6 _% p
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    ! b/ x* R  J! b' T
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');/ m! K8 P9 B- v, t4 k
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');3 [6 \! H/ n6 f6 W
  6. & m: K6 f: D) q6 b9 B9 t/ p8 @
  7. -- 示例:查询包含敏感词的角色名; A2 }6 w; X3 b" n
  8. SELECT *
    : S8 c" `- a3 i/ D
  9. FROM dbo.characters
    - ^8 h8 U4 }& Q) f8 [1 N/ U
  10. WHERE EXISTS (+ d' j3 p3 m  s0 i3 l  \
  11.     SELECT 1 $ S/ g1 l. t# e
  12.     FROM dbo.illegal_character_names 5 K4 Q" S, L; S# a: b2 `
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'$ N; V; u7 o  v: y/ T* y
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据" T, s$ J- b% B( B9 W2 e1 x
原始为:
' _- x! c# m( M
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    2 n* l/ w  k% S2 l3 M0 ^

  2. 8 j9 v4 w" K5 y/ @8 k0 J  s5 B0 y% W
  3. IF @v_ret < 0
    * C8 V" X! \/ W6 e: b  R
  4. BEGIN
    & ?/ i/ Y7 m' B' W1 J
  5. SET @sp_rtn = @v_ret1 z' _: Y! L: s$ d1 l% Z
  6. RETURN
    - r& U, O0 u  ^- y
  7. END
复制代码
修改为:/ ]  X3 ]7 x  C+ Y2 C& @
  1. IF (dbo.NameBlock(@character_name) = 1)
    6 x6 Q( w6 m8 l& I8 N0 k+ c
  2. BEGIN
    8 K$ ~0 ]1 l  A/ W9 ]  k
  3. SET @sp_rtn = -12
    * H) }  p' G) g' k( M& D
  4. RETURN, _" V8 H! b" P" v) ~
  5. END
复制代码

& q: V6 S  T  S' x' ]( ]/ H2 P3 V6 Y1 ~& z" ]. P8 Y5 n* ?

9 n. {. V: O1 O
" l$ }! J. V6 G! J$ L
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-7-7 21:52 , Processed in 0.057463 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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