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

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

[复制链接]

149

主题

291

回帖

5186

积分

管理员

积分
5186
金钱
1661
贡献
3085
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
# U1 [  ~( p( A. W$ R
2 v0 k6 [! w5 l) d) q$ {6 Y8 r/ M
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数; z. q  H  A6 ?" A8 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 (
    - ~$ i1 T' b/ m- b8 Q
  2.     @character_name NVARCHAR(40)0 `& m( J5 p& p+ F) I
  3. )9 m# w- P0 C" J7 X. t. `- G" w. u
  4. RETURNS TINYINT, @+ p. @. ~. G
  5. AS' I3 T" J8 G" P* C9 z7 D
  6. BEGIN
    . k& J3 P9 Y7 Q' D* C; q
  7.     DECLARE @result TINYINT = 0;  A8 ~( h1 N; v4 i- I5 H3 x
  8.     DECLARE @char NVARCHAR(1);8 `: r, n3 E1 m- ?4 `. w9 d1 q, r
  9.     DECLARE @i INT = 1;! J1 b7 C" p5 L0 }  L
  10.    
    " _" f" l) c1 h
  11.     -- 遍历每个字符,检查是否合法, T8 p* m" I7 }+ \1 I: ]7 z
  12.     WHILE @i <= LEN(@character_name)' _& B5 w0 U- w
  13.     BEGIN
    8 ]& o8 _) F0 F, K
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    ; i* W% s6 l; d7 P% h
  15.         . N$ @& L( r" E$ J. I4 ]) L
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    ) d# O; O/ N+ Y; N- p' \
  17.         IF NOT (/ {+ P7 D' |/ R0 k6 m4 v( Z! ~
  18.             -- 中文字符范围 (基本多文种平面)% _" ^6 {; O- Z9 G
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    ! {, c( {' K0 O9 a' X8 }- f
  20.             -- 英文字母和数字- p. Q3 o0 [6 D' X4 r) j
  21.             @char LIKE '[a-zA-Z0-9]' OR" a  _8 x# h# K( ?) }
  22.             -- 允许的特殊符号
    ! O7 w9 p% e" T9 s  N
  23.             @char LIKE '[_ -]'' M+ C- w  X) V2 {
  24.         )
    " K$ x6 {, T  b7 R% {6 h
  25.         BEGIN
    ! R2 W* C9 [2 g4 u
  26.             SET @result = 1;2 H( q, T3 ]( {
  27.             BREAK;4 j; ~2 p1 f3 g$ l# ~
  28.         END4 J) _# f) n/ b5 }& _
  29.         
    & j! T9 [# A  w
  30.         SET @i = @i + 1;/ X! s* |' e) w7 G# q% {" v% i; `
  31.     END;
    5 f$ B' R' ~0 `  Y
  32.    
    ) z* T( X8 P) V7 Q# t: Y2 c
  33.     -- 检查是否在非法名称列表中
    * q. g& w4 P- x3 A0 d' |1 H! @  ~
  34.     IF EXISTS (+ s9 j' [4 C. U$ N
  35.         SELECT 1
    9 R1 E( T  n) ~. E+ q8 f
  36.         FROM dbo.illegal_character_names # u, X1 q2 `8 ?( _. Y  r
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    " w: ]) Z, X' T
  38.     )
    - o" b6 h6 f- r) F% @! G' u
  39.         SET @result = 1;. m5 o# f! Q% F8 @
  40.     8 A6 R7 {# `1 q6 ^
  41.     RETURN @result;
    - l3 N& N! h. t8 N7 N1 F
  42. END</span>( i: C, {3 t$ N4 a- ^) |$ z( u
复制代码
插入屏蔽的字符; W1 Q7 O/ I, N3 d7 |' s
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    4 i8 g3 O2 V7 i' |; Y1 b
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    . j* J9 s( Q5 X
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');8 u' N" U+ T( S; U; i/ K0 `
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    4 q2 G+ K7 S, X
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    ( e& }! q7 I6 t
  6. 8 e* Z  z6 E+ N( k7 f. [; h
  7. -- 示例:查询包含敏感词的角色名! Z% g1 W( B7 d/ i3 j1 D
  8. SELECT * * ?/ p, P, M5 s+ x3 g  D; w
  9. FROM dbo.characters ' C# A; I3 Z- ?1 H8 K
  10. WHERE EXISTS (
    $ N: o( O: e  b. E, g: T
  11.     SELECT 1 + ?& V9 [' I( P$ ^. C
  12.     FROM dbo.illegal_character_names
    & E5 j4 G; z  ~
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    7 w9 p) ?" U4 ~9 [
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
6 }- L8 M& t! z/ q原始为:8 }0 \# ?- d3 d0 V% @
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT5 c! I; ?3 t' Y: J3 t$ I2 I
  2. % e3 u% `7 F# T+ C, U$ M
  3. IF @v_ret < 0 0 O, Z, e8 C6 M; {( f( }
  4. BEGIN8 m7 b* s) B- f/ Z9 `; L
  5. SET @sp_rtn = @v_ret: i2 B' @: R0 t; ?: @
  6. RETURN
    & ^. P7 Y; _& S& `& m# v7 [
  7. END
复制代码
修改为:2 N8 O% n- L/ ~1 y
  1. IF (dbo.NameBlock(@character_name) = 1)
    " |1 u4 b# x" d5 n" J2 k- |  ]1 `
  2. BEGIN$ ^/ _0 H6 i$ H4 v: i
  3. SET @sp_rtn = -12
    0 V% s( O$ b" q- j; K4 a
  4. RETURN+ k% l: q: O  m. U: }
  5. END
复制代码
% B- e% e% E$ A# d- u

2 q6 H$ \- C9 p) R, O$ i3 J& {. M9 t4 Y& H. w6 s
- r1 Y7 R3 R5 q9 d. w
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2025-9-19 14:57 , Processed in 0.145634 second(s), 24 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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