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

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

[复制链接]

139

主题

236

回帖

4114

积分

管理员

积分
4114
金钱
1476
贡献
2263
注册时间
2023-11-3
QQ
发表于 3 天前 | 显示全部楼层 |阅读模式
建立新的限制表
5 E5 P8 S: T( R/ Z$ {& q
" N1 t& ^( H# g" K. r
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
. X, _; T# M# w" z5 d" c* i8 S
  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 (/ x' }; j% T# Z. @
  2.     @character_name NVARCHAR(40)
    2 f6 H, c+ i/ E  ^
  3. )2 ]( R- g0 I0 s2 b% `
  4. RETURNS TINYINT- D& p/ c' f  i, @
  5. AS
    - S; U0 k' m7 z$ D: s- W! V
  6. BEGIN- }. M0 e7 }0 j$ u" j8 t
  7.     DECLARE @result TINYINT = 0;
    # `) ?3 [, U  v
  8.     DECLARE @char NVARCHAR(1);
    6 O6 K" h" P: E# J3 _
  9.     DECLARE @i INT = 1;& |* t4 [/ w3 j* c
  10.    
    - u: M" V, O) i: I
  11.     -- 遍历每个字符,检查是否合法* B7 V# E5 s) S& B! i; z$ r
  12.     WHILE @i <= LEN(@character_name)  e5 y# ?$ k9 f5 z) J
  13.     BEGIN  Q; o7 a% b+ I$ H( X
  14.         SET @char = SUBSTRING(@character_name, @i, 1);6 s( |5 o* C0 C! |& g0 r
  15.         % Y* r: U; k5 @4 M+ e8 T2 Y
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    3 ~3 p, K2 J% r# R+ T6 ?
  17.         IF NOT (4 S. P. M  Z9 b9 {  U
  18.             -- 中文字符范围 (基本多文种平面)/ W+ m. l3 i( l" R1 u- X
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR! O: c: V, C" y/ o8 i, W6 Y& A# `- h
  20.             -- 英文字母和数字
    7 L9 A# @. J5 P0 l; D& C" Q
  21.             @char LIKE '[a-zA-Z0-9]' OR5 F6 z4 j: i( _
  22.             -- 允许的特殊符号% R! S2 V# |+ N) I9 p
  23.             @char LIKE '[_ -]'
    5 b2 m+ L8 ]! U$ C' k' F
  24.         )
    & K: E# q0 a( L: T. S9 C+ N" X) F) E
  25.         BEGIN
    , d7 q7 K. }, q/ X) N8 @
  26.             SET @result = 1;; Y1 C& u1 ]4 R* m0 n
  27.             BREAK;
    ; o$ h  w; }: E$ ^0 {. m
  28.         END
    3 @' [/ o0 `8 R! E3 R3 K
  29.         * q$ W. G/ E+ R. q
  30.         SET @i = @i + 1;6 P5 I6 o4 J  h7 V. G$ n
  31.     END;
    2 M; }9 m& @/ d( j) Z. `  F( V
  32.    
    & m6 B) @3 T, O3 {
  33.     -- 检查是否在非法名称列表中
    % [6 y' \# i/ o! ^/ _+ A3 o
  34.     IF EXISTS (% i0 f& K2 p4 Q* Y/ \0 r
  35.         SELECT 1 4 ~7 c+ j5 Y+ P5 S* U
  36.         FROM dbo.illegal_character_names # D6 y4 M" M4 q  x8 ~! p
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    ( I6 j& E! A6 U$ ^; i9 O
  38.     )  j( S8 |8 |/ x- G" d# U+ @
  39.         SET @result = 1;& ]- [; L! F8 S8 w! a: b+ m
  40.     ; x8 X5 ]. [8 Z; M
  41.     RETURN @result;8 S1 j& h$ s4 }/ j& {3 n
  42. END</span>( n: X' c+ @8 w; G. K
复制代码
插入屏蔽的字符6 ^* I2 F3 r" X0 k4 W, J$ C; S
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    2 g+ [: Q; L7 D. H( M) i
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');2 ^1 E+ Y) L0 f$ |% k
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    0 E3 A+ |) ~$ ^5 l5 t
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');& ?8 ]. v* \. Q
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    ; p4 A% a! y2 r/ Q  \
  6. $ n6 @% V! D( |8 l( o, }' ?3 w
  7. -- 示例:查询包含敏感词的角色名
    5 r' j+ I; P) }6 z
  8. SELECT *
    % p, A9 G! z% H. H+ M. O4 B
  9. FROM dbo.characters : L& C* k; v+ b. Y+ z% o
  10. WHERE EXISTS (# A5 z, p) K% u! x' I& e  E! m
  11.     SELECT 1 5 T3 z8 O) n4 C  i6 D
  12.     FROM dbo.illegal_character_names ' @# q- X! r9 M
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    ' R" t) [# s6 T/ Q2 l! ~( F
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据' }: }- K2 {% l. Q5 p; y
原始为:
1 j5 @6 w% p% _/ B6 G
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT1 n: R. [4 g. ~; k; H1 `5 {
  2. 2 A6 x: {/ k9 H7 K: r# T0 M
  3. IF @v_ret < 0 4 D3 z* |- [) x) G* F
  4. BEGIN+ C! x$ k1 ?$ W) U) R. W. q
  5. SET @sp_rtn = @v_ret" Z; _6 g% q6 G9 i; |0 b/ \
  6. RETURN
    / s' T; J* {$ W
  7. END
复制代码
修改为:
) i( r5 ~/ [7 t+ U- v  _; ~5 K
  1. IF (dbo.NameBlock(@character_name) = 1)0 s+ a0 ~! G- ~' W
  2. BEGIN" d1 g" g  M* j5 Q8 V
  3. SET @sp_rtn = -12( Z  P9 z+ U$ W0 D% y  J
  4. RETURN" P- y8 M2 \) x' F, q
  5. END
复制代码

  u! f$ C0 ^8 J# `. g6 H0 ]. W2 S& u% L: M3 k
1 y$ d) R2 S; s  V$ p4 \# o

' p' G+ Q) a  h, {9 n) F/ w) j- v1 T
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|EGameol

GMT+8, 2025-6-9 00:48 , Processed in 0.037542 second(s), 24 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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