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

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

[复制链接]

164

主题

416

回帖

7820

积分

管理员

积分
7820
金钱
2282
贡献
4958
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
) _# f- M' D- k4 p0 {7 I  s& j1 E
6 Q* }% _0 z) J9 u3 ~
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
3 u; R5 }8 A& C0 ~, @9 L9 w  v
  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 (
    2 H0 ]& c2 i, E* {4 W0 A; O
  2.     @character_name NVARCHAR(40)% ^! Y/ [+ w2 N4 m( Q9 q3 j
  3. )
    7 Z# y. a( {) K7 c
  4. RETURNS TINYINT
    5 [% N, Q4 {1 W' D8 A) O* L: i3 \1 c' v* |
  5. AS
      o9 c5 _( e6 T8 H' N: Z& J8 E) q
  6. BEGIN
    - {& _5 Q# _: e: ^) M
  7.     DECLARE @result TINYINT = 0;
    / o: K- h2 _! F. D; r& A" d, T
  8.     DECLARE @char NVARCHAR(1);
    8 n. M, n/ _  i! g+ |
  9.     DECLARE @i INT = 1;  k& p' H* \, ~2 [& M) V+ s& W! \' d/ Q  B
  10.     ; y9 S$ c8 q' }% w. k7 b! \
  11.     -- 遍历每个字符,检查是否合法: K8 D/ @+ T* u# E
  12.     WHILE @i <= LEN(@character_name)
      H) F1 R' z% v
  13.     BEGIN4 k8 v. E& `' |9 N$ ?
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    * r2 L/ c0 U3 c, h3 ]# m4 U7 l; v
  15.         3 X: A  j* s& s$ X8 J# F$ f
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    3 |/ c" @1 U$ e# l
  17.         IF NOT (
    * `, |( f. t; s# J6 \* U
  18.             -- 中文字符范围 (基本多文种平面): v' _" g* n9 ^1 V  m  s
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR; Y) ~! l+ U5 A& Y0 [, Z& K
  20.             -- 英文字母和数字# C1 B9 V- x! P! n! _
  21.             @char LIKE '[a-zA-Z0-9]' OR* K" ]4 d: ~" w- P+ @9 Y/ C
  22.             -- 允许的特殊符号
    9 p- \8 n! Q3 e! v
  23.             @char LIKE '[_ -]'8 b6 j. d; a) f/ T/ F* O
  24.         )9 T8 b% Q5 L0 q1 G
  25.         BEGIN2 }! s$ y( _3 T/ \" X
  26.             SET @result = 1;8 m1 j; y8 w5 d
  27.             BREAK;
    + L+ U7 y& p8 o$ T9 Y% n9 B
  28.         END( b7 f0 J5 q* b1 S: d9 r2 E
  29.         
    + @" u: b1 t" `1 U* f/ v
  30.         SET @i = @i + 1;" Z" Y+ M) t$ t1 @" `; h7 ^
  31.     END;
    / F% j# w3 `# l. z
  32.    
    6 @$ D  y* A7 I7 ]9 g) }- U8 P
  33.     -- 检查是否在非法名称列表中
    8 Z, P# S- E" a# |4 j
  34.     IF EXISTS (9 y+ I' r9 H6 o, G
  35.         SELECT 1
    ' A7 {3 k( A5 k. a3 U6 ~/ H# Y
  36.         FROM dbo.illegal_character_names
    $ O0 V1 ^; I( K( f  i& X6 H
  37.         WHERE @character_name LIKE '%' + partial_name + '%', E; ~# r3 h) B2 |6 V
  38.     )
    , n3 W( C$ B; _2 U3 o. E
  39.         SET @result = 1;0 q# h6 U: t% A1 V4 x' s' X
  40.     + m1 |) M: F$ U9 O* I& H1 ]
  41.     RETURN @result;
    : n, k  c0 \0 u
  42. END</span>
    ( A! u* G! `2 @# P8 x5 s4 Z, I: u
复制代码
插入屏蔽的字符7 z6 A+ Z: ~5 Z6 {4 {: Q% h
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    : l2 G" L" Q( T# N; \9 t
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    , s; r5 R* u/ o: {: J- }
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');1 Q2 U  k" i& q, p  {- m  M
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');; p0 `/ y+ D) [5 Z
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    ) D" {" p( H2 e, B7 j

  6. ' W9 m4 ~1 ?- H6 z# u6 \" ^
  7. -- 示例:查询包含敏感词的角色名
    9 N$ R4 _9 [0 D2 K3 J
  8. SELECT *
    % l: a+ e: R% {! u3 b
  9. FROM dbo.characters 0 @9 a: O7 M3 i5 L3 @$ |9 t
  10. WHERE EXISTS (6 l; S9 A7 I! x$ e$ [; t
  11.     SELECT 1 5 o( {4 ?5 f6 r( N$ N) H. U9 P4 L
  12.     FROM dbo.illegal_character_names 3 q  a! u6 ~% c- w/ d; C1 }* X
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'2 A/ \7 F; C, P/ X% p
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据* r8 w1 N$ L7 i" v+ X7 i
原始为:
8 a' z1 V( @4 |! [$ n) C9 v: h: u
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    1 X8 l4 U2 K- `1 y

  2. 5 W' H3 H$ J, w0 z: U
  3. IF @v_ret < 0 * n0 H- y6 D2 n: F$ a5 D8 R7 G
  4. BEGIN# Y9 D4 W6 ^$ T" p0 C
  5. SET @sp_rtn = @v_ret& _: p0 g, t2 C1 X+ q3 F$ ^
  6. RETURN! `% y: z8 ?- X; [; j3 i
  7. END
复制代码
修改为:
+ C/ ~! O2 D  @- P# y+ X3 T0 j
  1. IF (dbo.NameBlock(@character_name) = 1); r0 m6 u2 s( r5 H% Q- s# ~  B8 P
  2. BEGIN7 r4 U0 a( I2 p4 [5 \, T
  3. SET @sp_rtn = -123 J! e6 L2 k  u* T
  4. RETURN
      F" x% m( L* O$ O! u2 c8 k
  5. END
复制代码

5 d& o! {1 N2 j8 K
: D9 H2 ^- g4 A' d, C, [8 Q/ a8 m, E6 k" Q+ K$ F: f

+ \( N6 v) t  r4 l' v
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-7-3 04:45 , Processed in 0.051272 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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