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

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

[复制链接]

157

主题

371

回帖

7181

积分

管理员

积分
7181
金钱
2067
贡献
4586
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表  p2 S; _2 e# |2 ], z

( }0 n6 w! c3 F  B' I6 N, K
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数4 @5 n/ K1 u+ R  `
  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 (
    5 G2 v2 m. h2 ~5 c5 I5 q
  2.     @character_name NVARCHAR(40)
    ; y8 w2 ^: |: o" s5 ^" X4 {
  3. )
    6 q$ K& k& k" _7 @+ b* l) p2 m
  4. RETURNS TINYINT5 i3 @7 T6 U) B# o+ W$ a
  5. AS
    ; e# m2 J: c0 D( |. H9 B
  6. BEGIN
    5 W/ v( Y5 s  L
  7.     DECLARE @result TINYINT = 0;
    + S0 D/ i9 t) n
  8.     DECLARE @char NVARCHAR(1);
    8 D6 D5 j- X; p
  9.     DECLARE @i INT = 1;. V2 O* C) u1 U
  10.     8 [" ]) c$ B6 C8 {$ w6 p$ \
  11.     -- 遍历每个字符,检查是否合法
    2 d% E  l+ i, b0 }. Z
  12.     WHILE @i <= LEN(@character_name)$ D& L; f6 `3 b( f# k& c/ c
  13.     BEGIN% I/ M+ Z0 b1 T1 ~/ x
  14.         SET @char = SUBSTRING(@character_name, @i, 1);" J. q1 n- z9 H+ [4 l% O* J
  15.         # q- }/ W* f6 ]. V' v
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    8 ~' M4 d$ P4 d: a7 l% I* P
  17.         IF NOT (
    - i3 A" P) f7 C# n3 P, T8 P
  18.             -- 中文字符范围 (基本多文种平面): M4 c8 ?% D5 a# R; v
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR8 J& V' c9 x8 d* B) u
  20.             -- 英文字母和数字2 o8 E  l, J, D" J4 F. U
  21.             @char LIKE '[a-zA-Z0-9]' OR; _: U# ]# P2 b, B4 P$ i
  22.             -- 允许的特殊符号
    ' J/ z1 ?3 G# i0 ?
  23.             @char LIKE '[_ -]'6 e( k( a1 U8 f2 n5 ^  ^
  24.         )
    6 f! ]" Q0 N/ v6 |2 M5 P
  25.         BEGIN
    # C. A7 x0 h9 W6 I- ?0 Z
  26.             SET @result = 1;8 ]( H3 H' W! u- s8 u2 b6 ]8 S
  27.             BREAK;0 |+ w# [3 F! k/ w: c# ~  N
  28.         END+ P4 |6 K  T5 i3 o$ @/ e- |6 G
  29.         
    ( ^# p! {1 i( Y* D8 Q; A
  30.         SET @i = @i + 1;: ?7 ^- A) x9 n4 A. u5 o
  31.     END;  M; {" ~  B3 a, s
  32.     % J3 |* |+ N0 H( J
  33.     -- 检查是否在非法名称列表中5 C$ c- ?  m% c; ~. R* Y6 F
  34.     IF EXISTS (
    / t4 d3 o. R" h# F# ^- b
  35.         SELECT 1
    0 d1 l& D2 ~3 o
  36.         FROM dbo.illegal_character_names
    8 V& V1 [5 f1 U4 l' X8 \# D
  37.         WHERE @character_name LIKE '%' + partial_name + '%'3 J  k4 I4 k" v# v/ K
  38.     )8 ?: e* @) r) G9 r9 V& ~) v3 o1 o( T1 m
  39.         SET @result = 1;
    6 i' }! h5 M. E" I( D7 A
  40.    
    & Y. N7 D& P6 \. D1 l" \
  41.     RETURN @result;
    2 J1 m/ l4 M( y) z& _2 y
  42. END</span>
    " A+ a, t& \/ Z9 C
复制代码
插入屏蔽的字符
- @# h, ?2 E) I- i5 ]3 n
  1. -- 插入非法名称列表(明确列名并使用N前缀)- [% \8 ^, A3 [  T4 w$ S9 ]7 r
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');: r1 ?# ~6 u: `9 A  D4 Y% ^
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');3 S5 T" h5 X! w
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    9 R; p+ R* V0 E6 h" W" E9 e
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');; O! _! W) h/ R2 ]% J

  6. , Q) ?9 h( r2 `* I. ]3 u2 T6 P1 Q
  7. -- 示例:查询包含敏感词的角色名; @, o2 s% m9 v+ F0 b( V' o- q( T* X
  8. SELECT *
    : G! J4 [; E+ Y) U$ X
  9. FROM dbo.characters
    2 E: f! B% o; z$ G6 P# N6 S  g
  10. WHERE EXISTS (
    & Q2 z. }7 ~* E% s* D" l7 H
  11.     SELECT 1 4 q. C! m2 k) ]. u, ~: T1 x4 a
  12.     FROM dbo.illegal_character_names / @3 `  D5 ^2 Y! c0 p
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'7 s8 C5 U, m; p
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据* K* u0 P" Z1 |2 E! X0 w
原始为:: ~# g4 A6 j' i% m2 M) s
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT& I, G7 d4 F# ?; i) K3 X: [* B
  2. 0 I/ f: C) B+ S: i8 F! l7 A
  3. IF @v_ret < 0
    . ^1 H( [( [8 N5 N( r
  4. BEGIN
    " }& o8 j8 O% y# d' k7 S
  5. SET @sp_rtn = @v_ret. n, d; _  W' l" }
  6. RETURN
    , r" F$ H% B" o
  7. END
复制代码
修改为:
3 q  g+ m+ K6 L, G( d0 i0 ~5 `8 N
  1. IF (dbo.NameBlock(@character_name) = 1)
    - f, G/ T+ n8 m, l6 a8 V% Z
  2. BEGIN9 B2 L& @, z2 U2 z; T
  3. SET @sp_rtn = -12
    ; ]. Q- l. @* H) s- M9 O/ o
  4. RETURN
    ' D8 W$ d) L/ x# _5 Q( \/ H6 I
  5. END
复制代码
3 w- h# j: I! |& R

8 r0 B3 [  I& k  ^" @! I4 ]2 F) }* z' a& t# k

  Q+ h6 ]4 T0 g% x
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-4-10 08:36 , Processed in 0.039638 second(s), 28 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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