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

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

[复制链接]

161

主题

394

回帖

7560

积分

管理员

积分
7560
金钱
2182
贡献
4823
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
1 h1 R% N2 Q4 g! c" {8 z$ i* q7 U3 o) u9 I+ c& j
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
- G, J6 X4 H1 t4 e) F' D( l% |
  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 (
    1 [1 K/ _6 ?% L: v' J# `4 f2 ?" x9 K! [1 O
  2.     @character_name NVARCHAR(40)
    - t. w2 J0 o4 H( [4 s( M
  3. )
    . \9 F( T+ E# p1 h( j/ Z
  4. RETURNS TINYINT
    7 A9 y) V. }5 G
  5. AS
    $ @. i- u" X( S4 F& x! {# r! G; t
  6. BEGIN
    4 P/ Z1 K6 P7 b% h1 ?9 V% S
  7.     DECLARE @result TINYINT = 0;
    % q3 g9 a% n  q0 A# |/ `  K2 i
  8.     DECLARE @char NVARCHAR(1);: D1 s- w  E4 Q6 B( i! u
  9.     DECLARE @i INT = 1;; {5 K! Q3 Y1 t4 v; u3 w
  10.     - i5 W. n2 E5 K! W6 K6 X. i
  11.     -- 遍历每个字符,检查是否合法! ^7 I& d" n5 i$ J: d! o* w" N
  12.     WHILE @i <= LEN(@character_name)
    ( w; H2 Q9 m( u  a$ w! E
  13.     BEGIN+ N; z% O# ]" y" r6 k
  14.         SET @char = SUBSTRING(@character_name, @i, 1);, V' r/ E5 v# Z: S* t) Y
  15.         
    + Q# n: H. [$ M, O; t) M
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号; \3 m$ q9 g7 W0 Y, j# G* V4 ]6 `
  17.         IF NOT (: L  r3 `# {% V+ N: f
  18.             -- 中文字符范围 (基本多文种平面)/ U+ u) V) t2 _5 \! |  O6 b
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR- [1 O7 f% O0 {7 |
  20.             -- 英文字母和数字
    1 m  x1 i* D/ ~4 \& d
  21.             @char LIKE '[a-zA-Z0-9]' OR
    % H! W4 @- z4 |+ X0 }# w( X4 M
  22.             -- 允许的特殊符号
    # _) s2 s" s2 @7 }% A  D( g
  23.             @char LIKE '[_ -]'
      l: x! G6 f( j% y1 o/ L
  24.         )4 ~. @4 u1 v, d6 X5 v# M% B
  25.         BEGIN) h, I- a3 L8 u5 G
  26.             SET @result = 1;" _8 Y% b* t6 B1 m' p2 i% l
  27.             BREAK;; i6 H) [7 ~& j% Y' R' j
  28.         END
    - a* f" a* C7 g, I# v9 {; D2 O
  29.         
    2 J% {5 F% b2 u
  30.         SET @i = @i + 1;
    - P6 e$ g' v% ~0 W
  31.     END;
    , g. q; R% q1 f" m3 l/ f6 i, U
  32.    
    ) L4 t( C7 [4 O
  33.     -- 检查是否在非法名称列表中
    , R" E: [& `1 `
  34.     IF EXISTS (2 O  @# K. y4 |% E; G* S/ U# K8 g
  35.         SELECT 1 ' U' z* X  Q4 }/ D" M; V
  36.         FROM dbo.illegal_character_names
    + }4 A; C" o# ?
  37.         WHERE @character_name LIKE '%' + partial_name + '%'- A8 Q! m7 ?' v( h
  38.     )
    0 y- @. s  G; s1 f3 k
  39.         SET @result = 1;; n4 B2 t5 I7 `7 O
  40.    
    2 F7 l( W+ O. }3 V. |& _- s
  41.     RETURN @result;( y3 b; ~9 V% v2 q, l3 ?4 s
  42. END</span>
    # c3 Y* e* `9 N: B) F
复制代码
插入屏蔽的字符, a# {% Q8 b, ]2 L  a1 p
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    ! S% r+ S, C) R/ v7 @4 y/ Y8 x
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    ) C8 J) x- C6 t3 g0 u( V/ t
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    & n( C/ i( h1 ?: `( f) c
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');- d. `+ X) x; g8 C, n
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');+ }% X& P( R8 ^7 F
  6. / w" Q1 `: E! m, Q+ a
  7. -- 示例:查询包含敏感词的角色名/ r& M) C0 c) o" R$ e. a0 I' X
  8. SELECT * " {8 U7 C* K4 h: q2 W. ]' D
  9. FROM dbo.characters % H( `  F, Z" g
  10. WHERE EXISTS (
    1 {* j* w( a4 ~; r
  11.     SELECT 1
    ' }$ i- U* R% A9 d) h
  12.     FROM dbo.illegal_character_names * }; ?& o5 y' c1 V) T1 ^
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    & Y$ w/ _% E9 a0 J
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
! _$ o$ E+ D* h  u) C原始为:
5 G. z3 J) T) G* N) ?8 I( \
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT+ T3 w" b- g/ q- ^. F$ f. y

  2. $ s2 d6 j1 O$ x1 R9 l
  3. IF @v_ret < 0
    ! M; g, [' `, R9 T2 d/ w
  4. BEGIN2 x" R/ H/ e# U( a% T7 A
  5. SET @sp_rtn = @v_ret
    : R( X" |& S0 y) Q8 B
  6. RETURN
    3 Z/ N7 f! C+ g2 w7 E8 p
  7. END
复制代码
修改为:
1 H" G; N$ \$ f. H8 L. J
  1. IF (dbo.NameBlock(@character_name) = 1); U4 Z6 N2 g. v5 {/ z3 m$ @* {3 o# p
  2. BEGIN
    1 e& Y  S( F' Y
  3. SET @sp_rtn = -12, _$ P( M4 d3 s5 Y
  4. RETURN
    1 a% m1 y+ r& r" Z) k6 i5 v& K* b
  5. END
复制代码
9 G2 `$ `( X% [) E" u) i
& }) I, @6 o( e+ [

1 h1 w5 U$ M+ S7 E9 ^% _
4 E0 k. x6 y! W+ [
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-5-23 15:07 , Processed in 0.033826 second(s), 28 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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