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

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

[复制链接]

151

主题

321

回帖

5508

积分

管理员

积分
5508
金钱
1753
贡献
3283
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表, H6 [" {1 K, c8 F* `
; D. A. V) x5 y- @& b/ S# M
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数* r9 z6 r% c" [9 @/ L& Q" V
  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 (2 q; W4 I1 n! B1 `" Y+ J0 ?
  2.     @character_name NVARCHAR(40)+ ~9 I$ v' x4 e- ]# ~8 T( W. F
  3. ). I( x' {$ G1 s7 l$ {
  4. RETURNS TINYINT
    + T( e- u4 \$ P
  5. AS
    ) y9 h* n( v1 {- ]# m/ u
  6. BEGIN1 F: v0 d9 q: g0 M) z' ~( W
  7.     DECLARE @result TINYINT = 0;8 O% d. N) z. Z# V. ?! E- Y
  8.     DECLARE @char NVARCHAR(1);5 s$ k, b$ T1 B, K) Z  l* j
  9.     DECLARE @i INT = 1;& L0 y/ {, A/ `! ?9 j6 a7 ]" S
  10.     ) _6 {: k9 C: G* X% G, S
  11.     -- 遍历每个字符,检查是否合法
    - G! s+ X9 [! j
  12.     WHILE @i <= LEN(@character_name)
    - S& m% H/ f6 L
  13.     BEGIN& G; |1 M. F1 c+ A0 u& G
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    ; M, X/ V' T/ n- g# z
  15.         3 p6 @2 ?& ]4 N4 K( Q* h
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号& T  C( F8 U) m# D. x
  17.         IF NOT (
    , K) v) r$ c# o; @4 M8 r
  18.             -- 中文字符范围 (基本多文种平面)& K- g0 p: S( w( P+ S8 {) \9 Y0 B
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    4 G9 _- f( y( X0 k. h& Z
  20.             -- 英文字母和数字7 H9 H$ g6 v, A; w9 Q+ b/ ]
  21.             @char LIKE '[a-zA-Z0-9]' OR9 f7 ^5 F* E7 T0 @9 N+ P3 \
  22.             -- 允许的特殊符号8 U5 T7 I- e1 x8 R+ a$ m
  23.             @char LIKE '[_ -]'% l" r5 V/ V% I4 }3 ?' A: d
  24.         )
    $ M+ _3 b; p  V1 ~; A
  25.         BEGIN* r$ i) o+ x$ [" z
  26.             SET @result = 1;# E$ n9 J  T& b% C" F- s+ y
  27.             BREAK;
    , {! ], U) |6 N5 J* d
  28.         END7 B. h2 q8 y% F3 n) U6 ?0 D; r
  29.         
    9 Y# {3 R' c' k; _6 f* P( ^
  30.         SET @i = @i + 1;
    + u" u/ t! ^3 A8 j
  31.     END;
    7 E4 I. u! _' \  d$ a
  32.    
    2 H( N" h, S. a  O* {8 {7 n
  33.     -- 检查是否在非法名称列表中
    ; |4 y. \; P+ p+ d. p* s" t. ~! w
  34.     IF EXISTS (
    ) i1 Z5 ]( p2 \! z0 ?# Y& `
  35.         SELECT 1 / s" X" I# p# V! c, M5 F
  36.         FROM dbo.illegal_character_names
    ! Q; \  r5 ]/ Y- M( G9 q) f
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    " `# m* e( O. X
  38.     )9 J" f4 G, F% E3 B) M2 r" |1 ~
  39.         SET @result = 1;$ e+ K( x7 h: l% x
  40.     ' b; C; }+ \( F7 b' G5 h
  41.     RETURN @result;9 v/ c! S' P5 ]+ o% X; g
  42. END</span>
    # a$ R8 ?/ D( E) l. z( P
复制代码
插入屏蔽的字符
8 z  p; B+ O$ J) }
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    + b' k7 y% U+ ]& L
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    : n3 K% J+ [/ A9 E$ ]" }9 X  f
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');0 ~1 r7 \( c3 g2 m
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    7 h3 C9 h  Y; n8 J; S. v
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    . Q! u& ~1 _# n" }7 P3 I5 i7 Y
  6. 0 ^0 c- M4 z# v
  7. -- 示例:查询包含敏感词的角色名
    3 O7 |( b7 t* Q2 S7 [3 |  o5 V
  8. SELECT *
    ' d: {. @- @  k3 Q6 ]+ g5 Y
  9. FROM dbo.characters ( ~' h* r6 }9 {6 C9 h1 x! a, {
  10. WHERE EXISTS (
    % [6 w1 c  T" e! D! h4 h0 o
  11.     SELECT 1 + ^0 D2 ?" r4 U- d
  12.     FROM dbo.illegal_character_names 5 O4 o! _6 S& k( ~: _% J( `
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    * a' {+ |3 y8 Z2 n1 E2 b( t* p7 ?, l( G
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
! h- \* t- X: M. U5 L原始为:% E4 u1 @8 j5 \! O8 h5 M, C
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    % p' K4 k. r* N) U. u
  2. 6 ~: V% K) z2 ^: g! P! f; z" T
  3. IF @v_ret < 0
    ! w9 z$ V  a- ^; T7 ^
  4. BEGIN
    / T3 ]2 p, G+ s" q9 M5 D1 Z3 ]
  5. SET @sp_rtn = @v_ret
    9 f6 U3 [, {% ~& l; B" b
  6. RETURN
    2 X. N# @1 i! g+ \$ D
  7. END
复制代码
修改为:9 j' N3 O8 `  u. r) k* H  x
  1. IF (dbo.NameBlock(@character_name) = 1)
    5 U, ?0 o% g, {2 c0 l+ E2 R
  2. BEGIN0 R. J: x& `5 Z) ]% ?6 u' @
  3. SET @sp_rtn = -120 }) t# k) H4 X* B) d0 u' P
  4. RETURN! ?+ Z9 v* c6 S1 s
  5. END
复制代码
' Y9 R5 E4 w2 c+ g7 g3 F2 f
+ f& B7 T! T3 J* A* I0 |
% U* T: q" c' v, u' e) p) n+ J7 N
5 ~( i" H1 d" M/ A9 \: O6 t/ R5 [$ e
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2025-10-27 01:00 , Processed in 0.084812 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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