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

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

[复制链接]

164

主题

416

回帖

7895

积分

管理员

积分
7895
金钱
2308
贡献
5007
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
, g+ `- m: w$ ^9 {* s1 }) d" B7 c" t$ z
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数5 S3 @2 Y+ F' x3 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 (
    ' D6 |& A9 U( E& ^/ W
  2.     @character_name NVARCHAR(40)
    ; B  G$ H. v% ^
  3. )5 M5 }1 \( I0 M; g3 ^0 h
  4. RETURNS TINYINT6 N" J9 g9 a1 F
  5. AS
    - H/ @- D/ A" P2 k4 F3 e( m
  6. BEGIN
    , y9 V" f' _: H) U7 N
  7.     DECLARE @result TINYINT = 0;
    5 p% `" D% r& u& l
  8.     DECLARE @char NVARCHAR(1);
    $ ^: E! U$ F, o: ?
  9.     DECLARE @i INT = 1;, \4 ]7 v: F* w) U0 u4 Q
  10.     1 y9 |- N, ~  {. [  s. T
  11.     -- 遍历每个字符,检查是否合法6 [8 Q* I$ `; b3 ]* X$ R
  12.     WHILE @i <= LEN(@character_name)$ g: ~* l+ f7 ~* T. y. ~
  13.     BEGIN
    9 a( O& w6 V! Z% Z/ F
  14.         SET @char = SUBSTRING(@character_name, @i, 1);: M7 v( ^) a; B- Q( V( o8 \
  15.         ( i$ f4 L2 Z2 q, n4 {9 O
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号6 k- c0 s0 k" ]' ~% F0 r. ~
  17.         IF NOT (
    " g0 R8 B% C! s  c1 J% J$ O
  18.             -- 中文字符范围 (基本多文种平面)
    2 A5 g/ E+ r3 E1 R' F
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR+ ~7 |) k4 r7 ]+ J- N
  20.             -- 英文字母和数字, `+ ?) k( n" z" k2 f
  21.             @char LIKE '[a-zA-Z0-9]' OR& v8 u( M0 s! G- H
  22.             -- 允许的特殊符号
    6 s) V9 D2 G7 X. ]
  23.             @char LIKE '[_ -]'/ F3 b/ w2 U) T7 W) B: h
  24.         )! o8 r4 y3 o. K3 l& k) e/ ]
  25.         BEGIN
    ! S& l" r) G6 R9 S- ^
  26.             SET @result = 1;
    $ H. h. N* q! z
  27.             BREAK;- m5 D" `  x2 `  s4 f
  28.         END, h0 w3 B* X: t4 h
  29.         2 O$ S$ K/ J# _) W
  30.         SET @i = @i + 1;( g5 L" k$ C3 l3 M: f
  31.     END;
      a0 f- X" Y! f2 W$ Y
  32.    
    " j! b6 H! @3 m. Y9 n! l" w! \
  33.     -- 检查是否在非法名称列表中. w; U7 F( c, j2 U
  34.     IF EXISTS (8 o9 z7 P1 D. F
  35.         SELECT 1 , o' C0 q& x% I2 A# j/ r3 U' ]/ N* v
  36.         FROM dbo.illegal_character_names 4 [- v3 C; g1 F* b
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    2 l$ v# p1 Z- V4 [9 y/ m% ~
  38.     )) [$ y& t3 C7 Y9 l7 A$ L8 K
  39.         SET @result = 1;1 x8 {4 s, q! D2 ^
  40.     * ^; w" G9 {- H: H" C. S" ~
  41.     RETURN @result;$ |; {5 q' [- U
  42. END</span>
      e: t$ v7 w0 G/ }2 @7 d
复制代码
插入屏蔽的字符* v/ R3 ~8 N0 _1 \1 b
  1. -- 插入非法名称列表(明确列名并使用N前缀)6 h. a6 d* X+ s
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');# L3 E% f& s  \7 w7 A# I
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');7 w! m8 s  s- c& K5 l
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');8 |/ Y: |" W7 X+ Y2 ]
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    , R5 C0 ?% \3 d6 i& c9 A' M
  6. 5 A9 C9 D* ?' G$ q2 a3 ?( a- b; W
  7. -- 示例:查询包含敏感词的角色名
    4 ]9 V( B" o* u/ D' ^" F- j
  8. SELECT *
    / H, m$ j1 C7 ^5 ]' f# [* p" g
  9. FROM dbo.characters
    0 [, R0 t. [3 o$ C  ^
  10. WHERE EXISTS (- g" q, x3 q9 t8 W& }  V
  11.     SELECT 1
    0 C( v2 ]0 O: r' l: S
  12.     FROM dbo.illegal_character_names
    0 Z0 ^/ a; y) u0 n  G% B. ]
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    9 l: h. A3 T: e: }6 F  [
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据+ m+ T# w; K# f# ]8 v# x2 d
原始为:
; @& R/ x* E4 m- p
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    # U! |! G' u/ p4 y2 u

  2. 6 \. w% n7 ^% R" A" w7 v
  3. IF @v_ret < 0
    0 S0 l( M+ h) D7 @
  4. BEGIN" J2 E0 V; K/ ^  y( H
  5. SET @sp_rtn = @v_ret1 Y" U, P# g2 O" J" Y# A7 t( {
  6. RETURN9 Q" ]. F& o4 x- F- Q, K6 {" [3 \
  7. END
复制代码
修改为:
; r# ]6 g5 o3 h& ?* H
  1. IF (dbo.NameBlock(@character_name) = 1)
    ! c7 j# @' Z& b% R4 O
  2. BEGIN( u/ x* G. v% O  ]8 w. x. O0 ?, N- E
  3. SET @sp_rtn = -12# v3 F' P& b. b2 E  t
  4. RETURN1 {+ e2 x0 @! Y0 V
  5. END
复制代码

  ~9 x: C: \& q8 L! {  ?
8 j. k" s" a; I4 p6 J! B: G
  D! V+ q6 A! E7 l
$ ~/ D; I3 w0 y; g
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-7-28 07:01 , Processed in 0.063572 second(s), 30 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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