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

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

[复制链接]

157

主题

366

回帖

7070

积分

管理员

积分
7070
金钱
2012
贡献
4535
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表8 A3 W; N# Q& d8 O( O
1 u5 _& @8 U, a8 i% _9 P( t
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数  U" o. u5 i: Z  x+ ?+ Y
  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 (4 a8 {# s% z1 g. Q
  2.     @character_name NVARCHAR(40)
    # g9 M+ a" s# q! w
  3. )
    7 P" ]5 S6 Y0 j- X  e7 c% ~
  4. RETURNS TINYINT3 C$ U& m. Q/ ]8 A
  5. AS3 z# r5 J- r$ M
  6. BEGIN) V  g  \! W) z7 L3 b; }
  7.     DECLARE @result TINYINT = 0;2 [+ X6 X! x$ _+ `* E8 W
  8.     DECLARE @char NVARCHAR(1);) L. m4 P. E: w' m  O
  9.     DECLARE @i INT = 1;7 c6 z% O& D" i3 R) v7 D* K$ F
  10.    
    ' y, _0 I1 h! C7 q
  11.     -- 遍历每个字符,检查是否合法, k( N( r6 I% \2 s9 _6 @# y5 n( Y
  12.     WHILE @i <= LEN(@character_name)
    6 `6 g4 X3 W" j8 ]9 G/ t9 J! l! Z7 B
  13.     BEGIN$ i+ s$ b7 n0 A$ T. ~' E/ q
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    6 V' R* t, E* G9 ?6 b0 ]! {
  15.         
    ' s/ P- c, O' h7 G) d# B: P
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号+ E: G+ ~; Z* ]% j5 g, A7 x
  17.         IF NOT (; v3 n1 t* m$ ~) p6 P) D8 j2 S5 T
  18.             -- 中文字符范围 (基本多文种平面)
    6 W( R& N1 A& {8 [( M
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    9 ?9 F) Q1 H! G; L' c/ N
  20.             -- 英文字母和数字
    ; S9 {2 z8 j2 [, K. a
  21.             @char LIKE '[a-zA-Z0-9]' OR5 R. e# u  @# F( {7 e- d+ I
  22.             -- 允许的特殊符号, N2 m" H" X  `/ B. l8 i
  23.             @char LIKE '[_ -]'
    7 f+ o  c$ c' D+ M  c
  24.         )
    $ A( i  |4 X3 G$ O& ^
  25.         BEGIN
    6 ?: N5 J" g$ G5 s1 h2 l
  26.             SET @result = 1;7 J4 U5 d" Y7 m/ O
  27.             BREAK;2 Q' @  V* f. t8 I) m
  28.         END
    ) j; q. ]( T# `/ R) w
  29.         
    # {- o, I7 y# v6 E- Y, K
  30.         SET @i = @i + 1;. O: Z7 i+ r3 W/ [7 F* P$ c+ J) X
  31.     END;+ X6 p9 j, t* [2 n' Z
  32.    
    ! _: V: p" f+ l: m
  33.     -- 检查是否在非法名称列表中
    ' ^1 a# D/ ], F+ _8 A$ h: n# O
  34.     IF EXISTS (
    ! H0 w5 G, u# @7 w
  35.         SELECT 1
    4 \; @# i; M* q: `9 i' P; H
  36.         FROM dbo.illegal_character_names
    7 V  |; Q8 X! u
  37.         WHERE @character_name LIKE '%' + partial_name + '%') K& M$ |' l! _
  38.     ); ]8 H  y% m1 ?, o$ f( f
  39.         SET @result = 1;+ z  m# k' {7 |. t; o
  40.    
    - H9 w5 h3 G5 w$ T3 H; A0 U1 I
  41.     RETURN @result;& R1 m, T0 a5 v4 O- S1 l* _
  42. END</span>% h/ C' ~) P/ u
复制代码
插入屏蔽的字符) c; E9 z8 P% H! u( H- ^
  1. -- 插入非法名称列表(明确列名并使用N前缀)3 M9 g1 s" q- B  m, U+ J6 S
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    4 Y- f) \2 G# f( F$ r0 Y* V; }7 e
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    ) x& ~) |1 _$ U# c( u+ |3 M; e
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');% A0 P8 y/ W/ t: |$ T* L
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');/ U& m0 \9 Z* {* Q5 A/ r/ t9 @% d

  6. , v; ]+ L' g# Z- F+ F  ^
  7. -- 示例:查询包含敏感词的角色名
    # ]8 ?( c6 l0 W
  8. SELECT *
    + M9 d$ e3 T# ]
  9. FROM dbo.characters
    $ W9 D. f) `2 T
  10. WHERE EXISTS (
    0 N+ Q( U: G( _6 T& U! l
  11.     SELECT 1 ! @6 \! j3 e: P: F8 d
  12.     FROM dbo.illegal_character_names
    5 B: s( d( A$ R" }" k
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%', }! I* \& {/ E
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
5 R+ M; }* I! r( s( S! T3 x' i原始为:+ N+ `, F+ _& O2 F
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT/ ^3 M; x5 w* U& z

  2. , P6 o5 [' r* A' ]
  3. IF @v_ret < 0 $ a6 M8 F% C9 T2 X$ t
  4. BEGIN# H$ Z6 B+ w$ G8 X
  5. SET @sp_rtn = @v_ret- c/ t0 y/ A: d' a  O# I1 [
  6. RETURN8 T2 F3 E3 W( U! W# r, P% j- N
  7. END
复制代码
修改为:
' t( C1 z/ }3 _, s
  1. IF (dbo.NameBlock(@character_name) = 1)
    ; n4 ]; j( K4 `
  2. BEGIN! p2 V8 O! F; f
  3. SET @sp_rtn = -12
    9 A5 H+ o" D! N
  4. RETURN2 r3 j! g. h: n3 S9 j
  5. END
复制代码

! g7 _6 V9 k( C! h: P* S; |0 X0 Q& d% B* O. i
% n' z/ I5 f6 W: }

! @6 T1 `+ C% a% \9 `- l0 J, T
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-3-27 18:57 , Processed in 0.041695 second(s), 26 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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