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

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

[复制链接]

167

主题

431

回帖

8245

积分

管理员

积分
8245
金钱
2423
贡献
5224
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表, r, f8 c' J( ^% S8 G5 O

* X/ V: V5 H( k2 a5 J, z2 H
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数7 m  |7 c7 t; V8 D8 y8 B. _2 r7 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 (
      M! F' C/ ^9 V+ C) f
  2.     @character_name NVARCHAR(40)
    ! p3 ~1 ?5 d& S2 @1 @9 y) Q
  3. ); \2 x+ q% r7 Y/ E7 w, p) t5 e
  4. RETURNS TINYINT- T4 T% D, _# V
  5. AS' V! r7 l2 f5 e! s
  6. BEGIN
      I6 \5 Y# Y- @0 g- z
  7.     DECLARE @result TINYINT = 0;8 E6 s4 s& |8 x: k
  8.     DECLARE @char NVARCHAR(1);
    5 D  M2 f0 H, {8 h$ H5 l' D
  9.     DECLARE @i INT = 1;% Z; ~: O1 [. D* _* \& B4 S2 T
  10.     ; ^* \3 J! o' Q. k0 O
  11.     -- 遍历每个字符,检查是否合法' E: c& h& X' u( Z6 O- U9 o
  12.     WHILE @i <= LEN(@character_name)& H8 t$ r. b; E" s
  13.     BEGIN
    3 _% D( y" _* t4 o$ T2 H) z7 n
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    : J+ X- g4 L' T7 e6 |0 X4 I( `
  15.         , {' w7 D7 j3 c
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    9 y9 \, O1 s* E" d' v
  17.         IF NOT (* O4 l2 C7 L0 s: c8 c: i
  18.             -- 中文字符范围 (基本多文种平面)
    ; m4 H* ?- r! Z
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR: a& X# s1 z4 C% P
  20.             -- 英文字母和数字) N2 ]$ _0 L+ b6 p! o
  21.             @char LIKE '[a-zA-Z0-9]' OR
    # P1 v$ C9 e' Q3 X" e7 ?6 b# H' t
  22.             -- 允许的特殊符号
    & F3 n' [" D, K3 @
  23.             @char LIKE '[_ -]'
    7 g% ?( u0 F3 x& X
  24.         )
    ( @6 [4 M% W, P; D, ^
  25.         BEGIN
    : }% x4 G0 C9 C( V" q
  26.             SET @result = 1;
    - N- a# x9 ^  ~2 k) K
  27.             BREAK;5 a: n) b0 G" A4 \  m
  28.         END
    " j* h" I# Z8 e
  29.         4 V% @% |1 B% m; E. u0 z
  30.         SET @i = @i + 1;2 C7 r6 z( `8 e0 v0 ^4 b  X, {
  31.     END;
    ! h/ ?9 k1 u2 k) z# h7 Q2 w
  32.    
    & F( I( o! y) d* g- w4 q
  33.     -- 检查是否在非法名称列表中
    . h  V5 e9 g6 X0 h9 n
  34.     IF EXISTS (
    2 F, X" U# y3 v
  35.         SELECT 1
    ) l, C" V9 |6 B* c
  36.         FROM dbo.illegal_character_names
    2 P, @& \6 m  e& v) p/ \
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    9 K- d$ a2 j6 k* Q) ^2 ]1 J4 n% s
  38.     )
    ) a; R! o7 r% }& D! e; N
  39.         SET @result = 1;
    " G2 N* o& {9 r1 V
  40.     . U1 y" L, \4 E6 `5 C
  41.     RETURN @result;! n9 u5 Q$ b2 I% U  \# }9 P8 f
  42. END</span>
    $ W9 w" ]- j1 f% x# s" y" ^8 k
复制代码
插入屏蔽的字符
5 U! G0 L& y$ o6 y+ h6 `3 D7 P
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    2 U+ k' F; ]- w. A8 J! `6 y
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    2 h9 s4 ?# N. v  k) z# L
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    6 K5 S+ T" K0 Q( v3 s, B4 j
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');5 q- I* Y* C% G" F+ n3 ^' [* p
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');4 y* E; [- a' J  z% T6 I( N/ ~
  6.   C) E" Q5 {; D$ n1 x
  7. -- 示例:查询包含敏感词的角色名
    8 {' r2 @, i  k- ]9 k+ b0 W+ m
  8. SELECT *
    - _$ V4 U5 [$ {$ p% n* n
  9. FROM dbo.characters
    7 F+ p: K* l# P/ {6 z6 A9 z
  10. WHERE EXISTS (
    % m3 ?; Y4 B) j% U9 j. w8 Z
  11.     SELECT 1 0 J4 P* q- {  D% G' e. i! \
  12.     FROM dbo.illegal_character_names
    7 T3 ?. W& S$ ?( S  U6 C2 Y
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'9 O% r+ T; I, G5 g' Y- S
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据4 X  X# @: R( z% b+ g, P
原始为:
* }" |; u$ w( `+ O0 S
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    ' u$ }; J+ m/ o: w* O3 ?. P

  2. % N% |# J  e. Z  ]
  3. IF @v_ret < 0 2 s# t  n2 x9 ]# ^3 P+ c' v
  4. BEGIN$ \+ ^" z7 H$ o3 ?) [
  5. SET @sp_rtn = @v_ret* j0 I* W, G( l$ I6 y/ q
  6. RETURN3 U6 q  e" u/ x- P* N! g+ v
  7. END
复制代码
修改为:7 L/ U$ V4 F7 W: J9 S5 H
  1. IF (dbo.NameBlock(@character_name) = 1)" S  l8 ]" l$ J9 y6 E# D; F
  2. BEGIN
    6 A7 s8 g" _8 U4 q0 V
  3. SET @sp_rtn = -12
    ' r0 z4 a# b# i) {
  4. RETURN
    * t1 j; \+ q6 ^( {
  5. END
复制代码

2 D6 a' x% ]0 e
. S; D! z; Y- S6 k" _8 @+ T2 I/ n- n) ^2 m" I# A
+ D3 _! K) O* P/ L
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-11-3 22:44 , Processed in 0.085762 second(s), 30 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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