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

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

[复制链接]

161

主题

389

回帖

7476

积分

管理员

积分
7476
金钱
2161
贡献
4765
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
+ c, Z- O3 P3 a  o: }0 t
& y/ r) w2 y4 j8 n7 J
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数: q6 a4 T0 }# y5 t' f/ j
  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 (( @/ F; Z  b2 D+ J4 f- z
  2.     @character_name NVARCHAR(40)  H5 R3 c9 Q7 ^2 A* S; S% L+ @
  3. )
    ( G- F+ @3 t) U$ @
  4. RETURNS TINYINT
    , `4 `: _1 q5 [* G6 k. K
  5. AS3 f3 q4 e; Z  U
  6. BEGIN
    & v! k6 O& [' N7 z( f$ t' T
  7.     DECLARE @result TINYINT = 0;3 u% }+ A" `. Q2 S+ R
  8.     DECLARE @char NVARCHAR(1);* _. E3 h$ A! ^' ^( e
  9.     DECLARE @i INT = 1;
    + M% {, k" j' ^) Y, s
  10.    
    7 Y1 i2 [0 U% r' D
  11.     -- 遍历每个字符,检查是否合法
      z# }; A. _) q4 L" }
  12.     WHILE @i <= LEN(@character_name)% d+ S$ l' I2 A
  13.     BEGIN
      ^9 v8 c* t2 q4 g( b
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    & ?5 i4 |5 g  ?3 w
  15.         4 K, f& I3 P4 n$ E+ a
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
      H. y' [2 f9 u7 n" r9 Q6 G
  17.         IF NOT (1 {" @6 X  [( B* V8 k* b. k( @6 G# Z- x1 D
  18.             -- 中文字符范围 (基本多文种平面)
    & X/ t3 @- H" p
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR* h1 \/ t& t* n5 L) p
  20.             -- 英文字母和数字. D0 }/ \9 I# p
  21.             @char LIKE '[a-zA-Z0-9]' OR
    . |, L5 I' q" x- o( I
  22.             -- 允许的特殊符号
    ! W6 Y. a' K* M" I
  23.             @char LIKE '[_ -]'
    9 {& D& ^6 e0 {
  24.         )  Y. |+ i) m1 ?5 }9 ?4 }
  25.         BEGIN
    6 h0 m, I) l  X3 K+ s& r, f. D8 s
  26.             SET @result = 1;
    % _8 Z$ A7 l4 u6 H
  27.             BREAK;
    5 T6 Q8 d1 K. z* W" [
  28.         END
    9 |' n/ w; V' F: C& L# w
  29.         
    - n& r% O6 p% `! X8 h- r4 a0 B2 B
  30.         SET @i = @i + 1;
    # X9 P3 Q# p4 n% m# `. |. b
  31.     END;; W0 e5 ^3 g( v1 [% c# S
  32.     , e- b/ B, n' E! P3 X; m
  33.     -- 检查是否在非法名称列表中: }& L5 X! Y4 C" @0 g# l! o
  34.     IF EXISTS (+ Z" p, L( G% T4 K- ]# _
  35.         SELECT 1
    * L. ^  |0 F; [
  36.         FROM dbo.illegal_character_names
    ; D) d) D" D* R3 K- J1 ]3 ^
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    ' h/ g9 C( M* e6 i) E9 J0 `
  38.     )/ A4 M$ B/ N1 X& O9 P- M
  39.         SET @result = 1;9 H' }: d+ L8 h* m
  40.     6 s4 ?( Y! I) Y! R
  41.     RETURN @result;$ z  {# s, D# O( z, D+ _5 z# |
  42. END</span>
    % m/ l) k  V0 x
复制代码
插入屏蔽的字符) a0 S& s. F  G+ v) f# F: t
  1. -- 插入非法名称列表(明确列名并使用N前缀)& N) r6 h- _6 Q& Q% W1 N
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
      U  s( Q9 O. A) X& F
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    ' U  I* L" q' C, C. @
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');$ o% U6 B6 W" _' ]5 L5 O* u
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    : N1 s' g/ E; s8 U9 m9 P- G
  6. : U0 Z+ t! e# x8 B3 J; ~: Q
  7. -- 示例:查询包含敏感词的角色名" I4 w7 N* H; _# W& S) k2 o3 M" B0 l
  8. SELECT *
    1 `3 P; X; ?+ G: H8 c) G
  9. FROM dbo.characters 2 |3 o0 _; T7 q2 ^& t) A0 x0 L
  10. WHERE EXISTS (. q; ~9 ^+ D+ {) z# n
  11.     SELECT 1 - |4 j: ~7 S& @' k) d
  12.     FROM dbo.illegal_character_names 2 }7 e- k9 t3 k1 U% m8 a
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'" o: m/ `  Z2 X: h' N6 j) W
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据! l! i9 @" a: h  }3 }7 R. y
原始为:4 j5 D+ ~% H* f0 w) ~
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    ; i- M  O. e  l; g3 N

  2. 3 H. T3 F6 R, t; P, c3 U
  3. IF @v_ret < 0
    6 `# M# o, S% {$ u! B
  4. BEGIN4 g2 i5 |5 @+ h3 e3 m7 R5 @
  5. SET @sp_rtn = @v_ret6 A8 a. N: G7 }2 ?: J+ q
  6. RETURN9 d8 m* z6 t" R& q- ?& J+ t
  7. END
复制代码
修改为:, _# l: _0 }' z1 C! i# c) E, L( q1 G
  1. IF (dbo.NameBlock(@character_name) = 1)
    % I% h8 ?; K- v1 ~) v
  2. BEGIN
    8 x2 J" \5 Y, m9 m5 j3 j* \' d' U
  3. SET @sp_rtn = -12: `7 D! w6 v+ y3 I9 W  [9 B) P
  4. RETURN) y6 n- G9 v) W- d0 \
  5. END
复制代码

# n0 p* _, V' ]# F0 V2 z! [& e  ^, b" Z7 \
: _) ]0 v* \; _
- H5 T  ^+ W3 v! N0 }5 X
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-5-14 00:22 , Processed in 0.034255 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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