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

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

[复制链接]

152

主题

325

回帖

5593

积分

管理员

积分
5593
金钱
1773
贡献
3343
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表6 M) d& A. E3 w/ f! O- [3 e7 w& z
1 E5 z9 P9 S5 H- J  `/ l  ^$ S
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
! j" r: b" \3 y, c* _
  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 (
    ' w) B" r8 m: U  W5 M
  2.     @character_name NVARCHAR(40)
    : _6 I# g* {$ e( e) r& [
  3. )! v* E' Q# ]% x2 C/ a, m! }; M
  4. RETURNS TINYINT2 t3 v1 k9 u4 o0 P" k
  5. AS8 n+ A9 q& q9 _8 B, E) M
  6. BEGIN
    0 V0 C2 A* M! Y' A
  7.     DECLARE @result TINYINT = 0;" p" i8 t+ M2 m+ A5 W
  8.     DECLARE @char NVARCHAR(1);
    ( x( f' v1 n$ w: t$ U
  9.     DECLARE @i INT = 1;
    1 E8 Z; H, K( p) ]
  10.    
    + ]. L: `1 ~+ C& A1 r6 h
  11.     -- 遍历每个字符,检查是否合法+ [: D, G9 b# w- G5 Q9 V
  12.     WHILE @i <= LEN(@character_name)- Y& `/ }* a4 J- l5 H$ a; ~. ~
  13.     BEGIN& _% R! W: i$ a
  14.         SET @char = SUBSTRING(@character_name, @i, 1);( @- t5 }& l2 v9 H& \
  15.         
    2 ^  J3 Y& H' _
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号) \8 K# N* E" j/ Q  K, s; \
  17.         IF NOT (
    " y2 A: t, F) `4 Z
  18.             -- 中文字符范围 (基本多文种平面)
    & H1 h2 ^) @) h. K& U( Q$ w, m
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    " i( T. L9 E9 M: e, V# F5 r2 q2 K
  20.             -- 英文字母和数字" W! `: g  k$ P* {$ I
  21.             @char LIKE '[a-zA-Z0-9]' OR9 t% z1 S1 K; M8 N7 P1 D
  22.             -- 允许的特殊符号
    7 T, B, i0 H3 z; s5 M$ K
  23.             @char LIKE '[_ -]'! B9 V% K! W0 G/ v+ I7 g" p1 r5 |# h
  24.         )) s& V! S  H) X5 X/ R) N
  25.         BEGIN2 Y1 U' q' e1 c5 h1 u0 h
  26.             SET @result = 1;" a" T2 W- G. V- E5 F- ~
  27.             BREAK;8 b" s( H1 V( @- `6 g& S1 T0 ~5 D+ p
  28.         END( `) m$ P0 S( \9 V. T
  29.         . k, @& A% y- k4 n
  30.         SET @i = @i + 1;( }& Z* Y5 G, Q
  31.     END;# u2 Z* ~: r+ {7 n( p- t0 r5 Z
  32.     2 G4 Z. s4 \! [% q' O
  33.     -- 检查是否在非法名称列表中
    * z7 F4 {! V# s  S3 ~, n
  34.     IF EXISTS (
    ( u& E  @" B1 o9 I5 F3 ], J* C
  35.         SELECT 1 : @* F7 h1 ~" b$ A  D# H
  36.         FROM dbo.illegal_character_names
    + n: G/ D" W$ V
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    2 H; f! {4 Y4 h+ d2 Q
  38.     )
    + Y9 v4 ^; b% M" C  K  \+ o- C, f
  39.         SET @result = 1;
    7 [, l+ s4 Z2 C
  40.     ( s0 h* \* k9 z. `2 u
  41.     RETURN @result;
    9 I" _  Z' O4 M3 T7 U5 e2 z
  42. END</span>4 ]$ p2 l, p" ?; _4 j0 I
复制代码
插入屏蔽的字符
+ C) ?5 x& H( z9 h! W
  1. -- 插入非法名称列表(明确列名并使用N前缀)* N* N8 [$ U3 Q. d2 {5 z
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    ; P: T- a, q$ g# P5 n1 j# H
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    9 P2 w8 T# O$ W: R' R
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');8 O6 M6 D8 H; p( O! ?3 l9 d8 k" D
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');' @$ \& ]& `6 j' R

  6. # l8 U! C0 O0 z% L/ m8 E% C
  7. -- 示例:查询包含敏感词的角色名
    ! K; }  x+ S! g2 a/ ^. w+ Y. \5 i
  8. SELECT *
    2 Z% @" b9 h" B5 Z. c& D9 T- H
  9. FROM dbo.characters ( {0 j7 N1 O' c- p5 J) ^4 b
  10. WHERE EXISTS (; n% _3 P/ w; X/ o+ s
  11.     SELECT 1
    , }5 V) H" n, t: D- l
  12.     FROM dbo.illegal_character_names
    & D5 _9 h! T+ v$ s$ s* ?
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'& @" ]  Q- X1 I. S3 V% X3 S
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据" b5 h$ t% _" P5 F" W' p1 O
原始为:* n" ~* H4 @. B2 a7 L% \/ I( N! k) F" x
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    / Q: I& }9 b1 f  v, c' {6 x8 ~
  2. # ^* T! o9 `6 R& ?* ?- X7 l
  3. IF @v_ret < 0 7 P0 Z, ?  ^) b0 i( q0 `0 |- j, g% {
  4. BEGIN
    . K( d# V5 p" ^6 y: Y, J, O
  5. SET @sp_rtn = @v_ret% `- }* S# p# u% G: m0 {7 o
  6. RETURN
    , \2 N1 B$ D4 X% N2 L
  7. END
复制代码
修改为:
2 Z5 L7 r9 n. y/ k$ P' _
  1. IF (dbo.NameBlock(@character_name) = 1)
    & U! J- E; n6 X' n  g0 J
  2. BEGIN
    ) l+ ?# }0 f# ^5 g. i# F/ r
  3. SET @sp_rtn = -124 l# _. r4 P2 o- R# e$ N9 N( {
  4. RETURN  S8 P" e! H( \* e& q; b
  5. END
复制代码
$ S7 ]: e" F( K3 W. v/ Y

* s( d" [' I5 h: A/ Y0 O2 B% r9 b1 I! {+ u6 @! {) R& ?
5 \+ C: ?+ E) m( m$ I) A5 X
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2025-11-9 01:13 , Processed in 0.042707 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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