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

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

[复制链接]

165

主题

418

回帖

7945

积分

管理员

积分
7945
金钱
2326
贡献
5036
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
$ {1 P( G% [) X+ f/ e
" z3 i: R  X; k& m+ S) ]9 A  x: r
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
+ r  S9 U. y! ?) G  {4 ^
  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 (
    ! g- z; q+ T/ {# _8 s9 y
  2.     @character_name NVARCHAR(40)) }+ [% _$ y5 h. s! W0 l) W, {
  3. )4 d4 |! m+ r2 p
  4. RETURNS TINYINT- B$ C. e  s) r
  5. AS  n! E1 B; s% u# D9 s
  6. BEGIN0 G! f/ c) }' O, w* E8 E8 h
  7.     DECLARE @result TINYINT = 0;
    ' N8 e7 n7 q) `1 m
  8.     DECLARE @char NVARCHAR(1);! v* s4 m' B# u7 x
  9.     DECLARE @i INT = 1;  K2 ]* \; `: R/ s3 X7 j- A
  10.     $ Q! d- P' H4 q/ _0 d: N5 y
  11.     -- 遍历每个字符,检查是否合法
    9 I$ g' P- H) d8 e
  12.     WHILE @i <= LEN(@character_name)$ g4 ~2 y3 ]' F4 P+ X! e) h/ Z3 o
  13.     BEGIN
    ' a3 d0 ?0 P8 ?
  14.         SET @char = SUBSTRING(@character_name, @i, 1);8 b# d: `: ^- y, ~9 C: p$ L
  15.         0 Y) ^, D. t& {+ ^0 _
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    " q" f6 y0 N- q, G" X# J
  17.         IF NOT (1 {8 m5 `, G7 }
  18.             -- 中文字符范围 (基本多文种平面)
    8 o1 q7 ~3 S- p8 S) n
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    " P" g! ~6 N" R
  20.             -- 英文字母和数字
    ; t1 W, e7 |) {) e' g6 w
  21.             @char LIKE '[a-zA-Z0-9]' OR
    - B$ C4 E- t. g  C  Q6 i
  22.             -- 允许的特殊符号
    . Y: y$ _8 s) d8 `+ H  Y- ?; a
  23.             @char LIKE '[_ -]'
    * g1 T) r: c$ x* O& `8 M
  24.         )+ n; h5 a. ?2 c
  25.         BEGIN
    1 M  `1 F) S; y. v# Z
  26.             SET @result = 1;
    ! [: G* b" D, Z- J
  27.             BREAK;. w! P8 ?4 {- @: M
  28.         END. y+ N, e! r, o" j* N3 Z: K4 _8 v1 y2 B
  29.         2 i% O3 e6 m8 U
  30.         SET @i = @i + 1;
    ; G0 P) F5 ^$ O% f2 N
  31.     END;  D/ {( r0 A0 |4 B
  32.    
    ( Y' z, Q4 ]1 J! x
  33.     -- 检查是否在非法名称列表中
    . _" ?, s8 u- k* o& P' G* ?
  34.     IF EXISTS (* N; \" [* q$ k! o
  35.         SELECT 1
    # W, d0 O. l) G: g* F  b
  36.         FROM dbo.illegal_character_names # _8 |% F1 W6 {
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    " T+ a$ ]( |9 A0 L
  38.     )" t3 Q6 G' F# u! }! c
  39.         SET @result = 1;" M0 i5 Q; O2 _2 t/ L7 J- ]
  40.    
      w$ ]# G/ {% Y1 g) n% d
  41.     RETURN @result;: L- \/ v: O0 g% O; C
  42. END</span>3 w" |0 V/ a; i
复制代码
插入屏蔽的字符
3 [; g( |8 D# K/ h; W
  1. -- 插入非法名称列表(明确列名并使用N前缀)  }$ s5 g. j( u8 g
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    ' _7 i5 ~# F. b/ r& O. @
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');$ [0 q! ~  Z) n, O& [
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    " s- F/ t# `2 F3 B# {+ d' L
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');3 q: R4 m3 l. x$ ?
  6. 3 c* u0 M+ O2 F0 U
  7. -- 示例:查询包含敏感词的角色名
    ) \! B8 u+ C$ S
  8. SELECT * " ^, h/ E3 A! n: _1 J- a
  9. FROM dbo.characters 2 X  c. [2 d  E" p3 D+ M0 o- Q
  10. WHERE EXISTS (
    8 G" F2 t$ b1 U* W+ _3 A" \) k
  11.     SELECT 1 : b1 t5 u% h3 s" A
  12.     FROM dbo.illegal_character_names
    - z9 `5 p" G: s
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'  Z; n2 G! C- k' u) c
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
, m+ O3 b8 M5 N8 [/ m; P9 ~原始为:2 i/ c+ X' Q3 c- k
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    + V! ?. }5 M1 L) `" d6 e( [+ n
  2. ! {& i. B- D% e! t# {
  3. IF @v_ret < 0
    ) y; h: f3 C5 X4 }1 S# B( q
  4. BEGIN. T0 K* Y5 I9 o1 H7 g" V. F
  5. SET @sp_rtn = @v_ret0 h" a) R9 t  c! K4 J
  6. RETURN
    6 ?6 [' L. B1 W5 V
  7. END
复制代码
修改为:
4 v5 C/ d+ T% K. w: R% [
  1. IF (dbo.NameBlock(@character_name) = 1)) g# _$ h5 Y  _; p: {
  2. BEGIN2 {3 ^- W1 x# h7 H9 K5 j+ ^, e( i
  3. SET @sp_rtn = -12
    , F7 V3 R9 H$ |: E
  4. RETURN
    8 q" q0 V: V1 @+ ?  R/ O% l+ \
  5. END
复制代码
8 I. z2 e$ [, }( Z% [$ r; M. C

0 h4 P7 U/ b( f: W* \7 ~3 P7 }  M! C; c7 x
' c0 |1 I7 O; R+ c1 e
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-8-17 12:08 , Processed in 0.063205 second(s), 30 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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