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

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

[复制链接]

166

主题

426

回帖

8149

积分

管理员

积分
8149
金钱
2380
贡献
5177
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
% W; R: a/ ?, Y: j* Y
4 N: g9 a" V1 E- f" L* |4 V
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
- G+ p8 G& q0 O( T* {! O# H3 H
  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 (+ h" s, ~: {. H& G* f9 p% l/ u7 o
  2.     @character_name NVARCHAR(40)
    ( Z  L7 w8 |8 j& d+ j
  3. )
    0 a; X: [" H0 u
  4. RETURNS TINYINT+ o$ _# ~' z" a7 i, N7 }1 F
  5. AS, A2 g  [+ S  M. w; g9 z( Z
  6. BEGIN
    7 r# _2 T; p. F! F( Z! V
  7.     DECLARE @result TINYINT = 0;0 P' A- Y$ f; P! h! }) o
  8.     DECLARE @char NVARCHAR(1);
    / x7 h% Z* e9 _8 N& K
  9.     DECLARE @i INT = 1;  Y; @# w; U/ b& W: ?5 w
  10.    
    " N# e6 }  n  p  |" a( W' ?5 Q
  11.     -- 遍历每个字符,检查是否合法. y: b2 M$ r4 v" H: G
  12.     WHILE @i <= LEN(@character_name)
    9 P# m9 N+ Z2 P- m% L9 b
  13.     BEGIN" w$ z5 T0 U! r0 w
  14.         SET @char = SUBSTRING(@character_name, @i, 1);  ^5 r# r9 ]' c5 }
  15.         
    8 \# P' {9 p  g4 M3 z. U" g- H* t$ V3 n
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号! }8 E) o2 y0 m$ W# @
  17.         IF NOT (1 E: A7 g) M( @% \
  18.             -- 中文字符范围 (基本多文种平面)* M. X8 N/ g6 j0 l% N
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR" S+ W( O8 P) z: w! {" X7 o3 p/ y( e
  20.             -- 英文字母和数字) T8 J' [/ b/ c$ e! D
  21.             @char LIKE '[a-zA-Z0-9]' OR& e! X0 R/ x7 I" ]3 `& H
  22.             -- 允许的特殊符号
    6 k" c1 s! Z: i" s7 t& ?3 t
  23.             @char LIKE '[_ -]'7 N( x+ i8 E% m: c
  24.         )0 \4 j1 e# _, t* A' U
  25.         BEGIN
    : e+ w8 l2 y+ M5 e, ^
  26.             SET @result = 1;
    7 f  q0 F6 R2 G  S( [- s9 e/ y! m
  27.             BREAK;5 Z+ n& E/ p* H8 w/ r+ }
  28.         END
    & G' h  `5 `* Y0 N6 Q2 q7 \+ o
  29.         - T2 ?' U; r& R9 Z& s
  30.         SET @i = @i + 1;; I' M1 K0 U' z! `
  31.     END;
    ( e) }8 M/ G+ F% L3 a
  32.    
    4 V' [  W3 x+ ?. i% s1 f4 c2 H
  33.     -- 检查是否在非法名称列表中4 d% U4 J* z! L" x/ C
  34.     IF EXISTS (9 ?1 N4 @. ~! P3 D: L
  35.         SELECT 1 8 B- T% Z1 t! L8 m$ _+ H
  36.         FROM dbo.illegal_character_names
    - p1 X. d6 K9 c; J& G1 s
  37.         WHERE @character_name LIKE '%' + partial_name + '%'  W3 t8 M% e) R9 V6 u6 e
  38.     )! X; x; G5 T' b& r% {
  39.         SET @result = 1;
      [5 }: _( h: I% F( O4 A0 C$ L4 [
  40.    
    + L1 k6 _; f2 V9 I
  41.     RETURN @result;) d, L0 t; }  f' P* J& Z  R1 |7 K
  42. END</span>0 @* d; d! }; }3 {  |3 L' e
复制代码
插入屏蔽的字符
. a5 @( P5 C, o3 ?8 V: U1 t1 O; ~
  1. -- 插入非法名称列表(明确列名并使用N前缀)0 [% C, L: }- ?/ r
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');1 @& A; v+ }+ N; F+ h
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    4 c+ F. C& |6 e. q* i: M# ?
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    1 l+ ?: \5 s/ y
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');, W3 J) j& r+ m: k& U4 Z7 N

  6. " a3 U/ r) f4 a* R1 v7 ~, w) |
  7. -- 示例:查询包含敏感词的角色名
    4 [! U: V* h; G3 I$ _3 d* n
  8. SELECT * : `9 w& ~+ f- u( X
  9. FROM dbo.characters
    0 ^& o. g8 k1 z- u5 h1 V2 }
  10. WHERE EXISTS (
    " e$ `* q; h8 g% g
  11.     SELECT 1
    ! K' q! t4 M9 \4 E' W3 g
  12.     FROM dbo.illegal_character_names ) @2 }2 X# }5 Y. n( h/ s2 Y
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    # F) U- }/ Q- T! H: J( k
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
* N) O% O% F3 j原始为:
2 _! S0 k: c& L6 b1 p* {- z) N
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    $ z4 o  i: Q8 j0 P% i: G
  2. 0 V  A8 A4 ^& ?9 S* t! w
  3. IF @v_ret < 0
    0 E9 X5 f: Z4 I! K# K5 d  U6 B
  4. BEGIN- `6 \4 ]8 N  m
  5. SET @sp_rtn = @v_ret9 s. @7 }. {0 n' x' i
  6. RETURN# O; _) {$ Y6 P4 a
  7. END
复制代码
修改为:- l2 d! d3 E) q' ^1 [
  1. IF (dbo.NameBlock(@character_name) = 1)
    1 p* w. i( p5 F+ Z0 x4 p6 B
  2. BEGIN
    ! C+ f, T3 e, i- X; N2 T
  3. SET @sp_rtn = -12& b, X/ A( O' N. f& E  l3 w
  4. RETURN
    . `& W8 K* E: w: D
  5. END
复制代码

) E. C( @% P0 Z/ u, I0 t( a/ r9 o( v+ E6 Q2 h
8 g4 c& W8 A3 N, v0 B; r3 C% h
3 q! n9 ?3 k( v0 s% H* U4 {
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-10-3 11:54 , Processed in 0.046809 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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