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

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

[复制链接]

165

主题

418

回帖

7948

积分

管理员

积分
7948
金钱
2328
贡献
5037
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
% H/ S6 k' B9 Z1 {
$ g$ l# p" S4 O
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数4 N8 B1 O3 O" y( E3 W+ P
  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 (3 |+ i9 s7 J, g1 E
  2.     @character_name NVARCHAR(40)9 n7 `$ c6 @$ ]$ X
  3. )5 z2 V! F( X5 K. u% Z- [+ T" Y
  4. RETURNS TINYINT
    6 B5 i6 Z) P) ~: q* P4 U. C& F0 r
  5. AS! t3 S+ [& m2 P
  6. BEGIN$ O6 o6 H" s5 f! V2 z$ p6 T% L
  7.     DECLARE @result TINYINT = 0;
    5 b6 o, q$ M0 j; ~
  8.     DECLARE @char NVARCHAR(1);' ]1 d+ y& L$ K6 h; `! M/ M
  9.     DECLARE @i INT = 1;! R8 J( i4 u8 H8 T2 x5 T" z6 Q$ H
  10.     9 T0 s$ ~/ S2 ~1 E/ u6 B0 y
  11.     -- 遍历每个字符,检查是否合法" o7 T9 j3 a6 R$ l2 U" l
  12.     WHILE @i <= LEN(@character_name)
    . h& t: z5 }" p/ E
  13.     BEGIN6 r. D$ R9 U4 I6 V) g5 B
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    8 A: _3 U5 O8 h
  15.         & V  c6 d5 m( {4 M) k2 l0 m
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    7 [! i5 J$ y7 i. z6 Y2 H0 y
  17.         IF NOT (
    1 N; e+ S' n( t# r# Q
  18.             -- 中文字符范围 (基本多文种平面)
    ; z5 `5 E: K' v- }$ T9 M. ]0 G
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    2 k$ U. D& U/ Q3 f
  20.             -- 英文字母和数字  f! {- b8 k( p0 X1 |5 o7 S+ Y8 f
  21.             @char LIKE '[a-zA-Z0-9]' OR% z& L' z  x1 K$ X- q9 d% o0 S) X* Z
  22.             -- 允许的特殊符号
    ( R9 n$ `7 t$ V2 y& c0 I
  23.             @char LIKE '[_ -]', v5 }+ H1 ]8 n: ^# U8 s: M
  24.         )% e; a0 {& A# y# V9 m; _
  25.         BEGIN- [9 }0 W4 K& |  ~! x
  26.             SET @result = 1;
    : f$ y4 Y5 Y  w
  27.             BREAK;; C( ~9 ]" @" l# K
  28.         END
    $ O% d3 i) k8 {+ d  H. K" P8 P
  29.         4 r2 ?  T9 D2 T, Y1 A; E" V/ \
  30.         SET @i = @i + 1;/ ~4 A0 q5 @- H/ Y, r
  31.     END;
    & _: q) D/ }. }- n! f/ V3 K
  32.    
    ) m. s$ m! U) D: b8 \  u
  33.     -- 检查是否在非法名称列表中
    & U# O4 }0 \8 \1 m$ X5 S) N
  34.     IF EXISTS (
    % }7 N4 I, I, e3 u- b6 y$ ^0 e
  35.         SELECT 1
    3 ^2 O9 K- ]# j; ~& a
  36.         FROM dbo.illegal_character_names
    7 R. r  c' V) _5 p2 t
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    7 j+ d  t, i; ^6 b1 _. h  k- t
  38.     )
    1 q% `- x- Y# m0 T" a% i) a
  39.         SET @result = 1;! {% l! j1 n/ r" M
  40.    
    6 V# k$ H1 J1 D# K% z0 z
  41.     RETURN @result;, I. W0 ]2 Y& B) X! z
  42. END</span># J& t8 r$ [( G: c
复制代码
插入屏蔽的字符
9 x9 n& Q3 F2 {# e0 d1 l
  1. -- 插入非法名称列表(明确列名并使用N前缀)/ f& _7 ~- h9 n& p/ @4 L1 X
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');# _! @6 O; Y6 @/ d. E
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');0 L! `$ z) x0 X/ {. X0 U4 O) Q( b
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');' r: e& \" V: n. ~
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');# V/ C6 B' R+ `* Z- Z2 F

  6. ) P4 u$ v) K6 H7 @( v0 X! I
  7. -- 示例:查询包含敏感词的角色名
    ; D* e8 B1 E" c: B
  8. SELECT *
    / A1 S! H. N9 x8 E/ }; k  b
  9. FROM dbo.characters
    ( V- i4 c- t! Q( s; g& t# J
  10. WHERE EXISTS (7 C' w! F4 [: E3 U& A1 H% n
  11.     SELECT 1
    # J8 f6 `9 Y) E: u# o
  12.     FROM dbo.illegal_character_names
    - X& n5 C8 Z0 B" M# q) E
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'  c9 r  q2 }- _& h5 w$ [: H5 t2 k
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
5 ]2 U- t: v2 r" i% {6 B原始为:
8 u6 z0 W' H  _# k3 E) a2 R
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    $ q& Z4 y  A' p8 K- }+ y$ X

  2. 8 c- v" |! |9 M+ `3 a: H5 W5 w. P
  3. IF @v_ret < 0
    5 f* [) B2 c3 W' v# N. V
  4. BEGIN
    5 L  g) r% g+ r& U
  5. SET @sp_rtn = @v_ret
    $ [1 t- W5 m/ L5 @# b' Q* p
  6. RETURN  v9 b% ?$ u/ |4 d4 j1 z# s( B
  7. END
复制代码
修改为:3 n7 [1 G9 }+ r) l1 p; s3 ^2 N" o
  1. IF (dbo.NameBlock(@character_name) = 1)
    6 L, B' r+ i& Q% d- g$ f
  2. BEGIN' S+ @4 X* _* m& ]1 `) T/ T0 P9 y
  3. SET @sp_rtn = -12" V: r( l( A6 s  w$ ]4 B
  4. RETURN* I3 J: Q6 `1 \, Q
  5. END
复制代码

' e3 X9 `  J9 C, \1 m. _1 _" |/ u. W/ g/ \9 `

$ c& m  ?+ y  H6 ?3 y1 b0 W
! D3 F6 o2 t/ C  h2 `; ^, r
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-8-18 21:29 , Processed in 0.082476 second(s), 30 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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