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

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

[复制链接]

149

主题

294

回帖

5195

积分

管理员

积分
5195
金钱
1666
贡献
3086
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
* o3 ^, p0 q, g  q" e$ n% y- m  F2 K! s' l* ^/ h" w: N
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
* q8 `3 N& k1 @( g" O& j$ l, s
  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 (
    + C! |% I6 [* c2 N. j, ^
  2.     @character_name NVARCHAR(40)7 i7 o$ Z+ M7 l2 X' _: P
  3. )) O. b/ _. T; s9 X# N% `, M; v
  4. RETURNS TINYINT3 z  K% y2 F4 U$ W1 Z, w
  5. AS7 B+ U3 u( M# j0 O- s
  6. BEGIN+ ?# R5 ~5 {3 ?( t. [) [9 l, T
  7.     DECLARE @result TINYINT = 0;. H- y; K+ I) ~. |& x0 X
  8.     DECLARE @char NVARCHAR(1);
    / ^/ u, i% I1 E+ M
  9.     DECLARE @i INT = 1;
    ) {2 d% K$ _9 y0 G1 c" l
  10.     2 b9 O$ F) O% U7 v
  11.     -- 遍历每个字符,检查是否合法
    ; D1 {. `$ e4 k, x; {
  12.     WHILE @i <= LEN(@character_name)) k  X$ O: O: @; \
  13.     BEGIN( k. Q4 G1 }0 L6 \
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
      N8 S% C4 F& V. ]( u3 I
  15.         * s3 c3 ^& a; n/ |0 G
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    2 [' ?6 }7 i9 O( s; h: D
  17.         IF NOT (
    & A2 Q9 ^4 d" c: n
  18.             -- 中文字符范围 (基本多文种平面)' ^0 f3 c8 z0 j/ X7 f
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    + v+ d' P% p5 F
  20.             -- 英文字母和数字
    ' Z! x% X( @* z: V0 H
  21.             @char LIKE '[a-zA-Z0-9]' OR0 z8 e: G! s, A, A
  22.             -- 允许的特殊符号, t' Y+ {* m/ h0 G6 y
  23.             @char LIKE '[_ -]'
    # J* j4 c; A0 r! }; U
  24.         )$ R; h2 p- `: K. _0 i# A0 t0 _/ v& A
  25.         BEGIN3 S; B, k8 b6 r# y! q/ k7 \; r
  26.             SET @result = 1;
    5 y0 h5 V7 a1 ~0 J3 ]- v
  27.             BREAK;
    $ I  x# T, r( d  l
  28.         END' X% e, ?/ b* ^4 q# T
  29.         " Z( b+ n* a. I: b5 n
  30.         SET @i = @i + 1;
    ) R! @, {# j0 n+ }+ B
  31.     END;
    8 F. H7 Z; p2 _. N8 k) @' e# ~
  32.     2 W9 u: I  U) E; H$ c
  33.     -- 检查是否在非法名称列表中
    ( L$ S% T) z* a% s
  34.     IF EXISTS (
    ( t3 {: E$ k" R# m! |9 `6 F
  35.         SELECT 1 " v  T& ~6 ~" H$ [9 h$ i: J
  36.         FROM dbo.illegal_character_names 9 y+ e, A+ o2 J
  37.         WHERE @character_name LIKE '%' + partial_name + '%'0 v3 |  D! c( X( A4 z& Q
  38.     )
      Y1 @. [* e8 i# x$ C
  39.         SET @result = 1;
    ( }( e- k9 Q9 W$ p! r; ^
  40.    
    " _2 S# I! b( T
  41.     RETURN @result;: L) A8 s4 _8 e0 J) n; ^: _
  42. END</span>
      a' T, l/ }' @  G% j
复制代码
插入屏蔽的字符2 ]( o" J1 {6 h- P5 Q
  1. -- 插入非法名称列表(明确列名并使用N前缀)# `; o8 b# Z5 R$ ^4 R
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');* c% E( x+ [5 F! _7 M
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');4 s3 h& v, G7 K; n3 Y- P
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');) Q$ R/ Q  ]( r: \
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
      \9 T3 h# L* H' q) _' Y* U2 w

  6. # A! a! u' r  m: J: H! u
  7. -- 示例:查询包含敏感词的角色名4 ?; ^5 Q1 w: G
  8. SELECT * ' r" ~$ n6 b! j/ A
  9. FROM dbo.characters ( S! N* Z0 t) d' i  `4 |& p7 s
  10. WHERE EXISTS (
    - N6 H8 s9 m2 k6 B7 i3 C
  11.     SELECT 1
    6 X5 [# G7 Y) U/ ]7 L+ S
  12.     FROM dbo.illegal_character_names
    $ v( D9 O9 `& V7 C; e- k; F
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    " N* g# ?4 z$ G9 n8 B2 I, }; `( F2 w
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
* t1 e! j# w' |原始为:7 q: U5 q) A  Y' L, `' S$ f
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT6 f7 Q# G# i0 y
  2. 5 R4 H" G& M+ J
  3. IF @v_ret < 0 ! W* ?4 B( N3 G) Y8 a0 P8 k
  4. BEGIN
    8 e+ g  C, e  I# G0 S9 [9 Z- c$ y
  5. SET @sp_rtn = @v_ret; G. m1 R9 q/ m& D. v
  6. RETURN1 J- @! X. o* U( j5 q
  7. END
复制代码
修改为:
+ R) J7 Q4 {5 \4 r0 \
  1. IF (dbo.NameBlock(@character_name) = 1)
    $ t: y& m- V9 [) W5 I' I
  2. BEGIN; C3 b% F5 n9 q$ F- n
  3. SET @sp_rtn = -12
    # }2 \, l1 a  c5 I
  4. RETURN% \. N$ p& n& P+ S, a
  5. END
复制代码

% A! f7 Q/ g( y
9 n* n1 c$ \. [, u9 P
- O1 \' f- k7 ^2 C! a7 s! |  z

: ^% K7 ^% `  k# w2 d6 x. v
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2025-9-20 03:26 , Processed in 0.036058 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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