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

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

[复制链接]

164

主题

416

回帖

7820

积分

管理员

积分
7820
金钱
2282
贡献
4958
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
: [7 I- B' m6 K+ E7 C% _! i8 @" l9 Q0 }* z5 X/ k0 B) X
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
% K6 f9 R7 U) A8 L1 R6 y( 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 (
    8 [/ M, _/ O3 z% `4 |  D
  2.     @character_name NVARCHAR(40)
    - c0 S6 W* G: O" j; u4 }# i1 @% \
  3. )% X1 e4 Q4 _2 y; Q1 ]$ W
  4. RETURNS TINYINT- z5 C0 h2 T; Z/ d5 ?6 V+ B
  5. AS
    / e) l! C4 X, A' o! G
  6. BEGIN
    - I# u' y% I/ X2 p
  7.     DECLARE @result TINYINT = 0;4 x/ M7 z7 i' F) _
  8.     DECLARE @char NVARCHAR(1);
    ! }. D$ m$ J! b4 e' t9 }
  9.     DECLARE @i INT = 1;3 F" ?, Z$ M, R9 i  j, s
  10.     2 m  l+ }; Z* {1 v# h
  11.     -- 遍历每个字符,检查是否合法# n7 h' O3 w( d) {$ a" y
  12.     WHILE @i <= LEN(@character_name): H! k, G; p4 j# h
  13.     BEGIN# N' f. L- J8 A* D$ @" g  s
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    ( a$ K$ P7 y% ^' |9 O# ?. O. _
  15.         : L* Q$ k7 O( c& a0 ~- ]
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    ! Y9 R4 K- r5 E1 V% z: q
  17.         IF NOT (
    : J/ c6 T+ D0 ~0 {! ?7 U, p- e& u
  18.             -- 中文字符范围 (基本多文种平面)
    ( ~: M% e2 ]) m9 {: Q9 V
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR9 [4 ?3 S# f+ m/ K+ F6 Z$ {
  20.             -- 英文字母和数字1 I, k* ?; D* O
  21.             @char LIKE '[a-zA-Z0-9]' OR
    0 N6 T' \- s. V5 Y
  22.             -- 允许的特殊符号
    ' _- y: ~7 `( @+ X6 U" e
  23.             @char LIKE '[_ -]'
    5 ~/ K2 r* W3 u) |5 }8 R2 g+ W0 O. K
  24.         )0 L( R6 K! z6 i9 T6 O& {0 Y
  25.         BEGIN
    ' Z9 N. Q6 R8 W, E6 u
  26.             SET @result = 1;/ b' J$ s" w- D6 l# F! _: p3 O2 r) k
  27.             BREAK;1 v6 b: X( A. U9 `
  28.         END
    9 V$ a3 b8 V8 X5 Q& ]3 ~! j6 }
  29.         
    $ O5 t: f  ?5 Y  Q+ x
  30.         SET @i = @i + 1;! c7 s+ P" T2 d. D8 T6 h  u% |
  31.     END;, l0 N4 p5 T  j( n  ^7 O
  32.     , l8 p2 \. H) W' `/ K
  33.     -- 检查是否在非法名称列表中
    , `8 c/ I' _; _& ^* r5 L5 y
  34.     IF EXISTS (* R' m$ t  x, A- S7 Z# B& T( h
  35.         SELECT 1
    , u0 k8 y9 ?" i# g/ s9 d) }4 Y- X
  36.         FROM dbo.illegal_character_names : U" F8 X& }4 ~+ W% R4 h
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    ) _: E. _, v" r& [: [1 p$ }
  38.     )( o$ h2 y4 Z9 |+ J0 j& P
  39.         SET @result = 1;
    ! b1 ]) j! v% S9 n: S
  40.    
    % p4 e+ D, G* ]
  41.     RETURN @result;  ^" }( {& y) H( x6 V1 j2 {, j
  42. END</span>
      Z9 S1 k% i! _/ F
复制代码
插入屏蔽的字符* e! v8 P5 q) }, w: [+ [- D
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    8 j+ m; Y4 f+ @( \8 h* Y5 D
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    ' J& z( c  h' M: R% H
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');* [( z' U$ `0 y# c8 p
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');6 o3 S% m& k; H& l
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    " H/ U. s2 N1 ^+ h& v3 E% S

  6. ! F9 F% q) c4 Q) m: W3 V$ U
  7. -- 示例:查询包含敏感词的角色名
    * G" G! y' j1 @# Z
  8. SELECT *
      S* P2 L. f+ s8 R4 q
  9. FROM dbo.characters 8 }& I  |2 a# i, _: N" S
  10. WHERE EXISTS (
    6 R" S8 Z% l% E9 i" |
  11.     SELECT 1 1 O) w5 A: v7 C; O/ n; b# Z$ l
  12.     FROM dbo.illegal_character_names
    9 F7 y9 F( [7 C9 b8 Y
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'# Q' `- c( [" p3 q9 Q
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据8 x! t( \+ ?4 h7 y$ b
原始为:
: `- j) e9 ~( f; e; F
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    7 O1 V# s' L! H! Q& L

  2. % B5 M+ y8 Q, W
  3. IF @v_ret < 0
    0 S9 J* ~7 g3 Q  j. k( N
  4. BEGIN
    6 T7 l: m; ~. b& K- N% A7 [
  5. SET @sp_rtn = @v_ret
    $ n$ o! Y: V0 Q0 z! Q, \0 Y
  6. RETURN
    3 `1 d$ e/ W/ M" m! s7 ~
  7. END
复制代码
修改为:
- z" Z9 m4 |- E& P" @4 F
  1. IF (dbo.NameBlock(@character_name) = 1)' c4 D, p/ r1 s- b5 C& a
  2. BEGIN; i' X- H$ R; U/ g0 j) [4 Z, K5 q- {
  3. SET @sp_rtn = -12% W  S! A3 ~: u- L
  4. RETURN/ C9 p% p/ @3 E4 Q, g; k9 R& W( R
  5. END
复制代码

0 h) }2 {6 K2 F/ Q6 B0 i+ |' q$ }1 h( Z
9 g8 J/ O: }6 H/ t) e8 w
# g" V' z: }5 g: m  {$ p, b6 S
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-7-3 07:37 , Processed in 0.053594 second(s), 30 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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