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

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

[复制链接]

155

主题

348

回帖

6179

积分

管理员

积分
6179
金钱
1868
贡献
3808
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表& {3 y% \7 h3 L( |
4 R( y3 \; g( @1 k
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
% |0 ^( r2 U' W- y3 Q: ]
  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 (& s. C& Y+ o  \( t2 B
  2.     @character_name NVARCHAR(40)
    : L- `. J* l: a/ U  y8 f
  3. )
    ( f- R* c: a8 b# H3 X  l
  4. RETURNS TINYINT+ ]9 g0 F& Y9 Z. \% c9 ?) w: A% j
  5. AS
    6 j2 t; [( |" t6 L% h' O
  6. BEGIN" N! X  H/ u! B6 w: z
  7.     DECLARE @result TINYINT = 0;4 f( o7 U, {- |# @1 y5 h
  8.     DECLARE @char NVARCHAR(1);* t' w) D" ]2 _, {& X
  9.     DECLARE @i INT = 1;
    ( i4 I! Q2 }- e
  10.     : Z' t; c8 ?" S# }) _  R9 r# {
  11.     -- 遍历每个字符,检查是否合法
    8 d% x6 l* U; P9 N  Z/ L3 {. ?& E) V  Z
  12.     WHILE @i <= LEN(@character_name)# x: X, a6 k$ T# \2 Z) {2 d( ?
  13.     BEGIN
    1 r. W6 Z) j) i1 W6 m" c
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    ( y1 m# y" Q# |& Y3 O
  15.         ) T$ h, p" C" I
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    # E" s9 V! V" B$ h. U- H
  17.         IF NOT (
    0 T. b) ^5 ~2 ?8 I
  18.             -- 中文字符范围 (基本多文种平面)
    " G0 o% v2 E  I6 N  P
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR* g2 \9 }) K4 g' r6 m" ?
  20.             -- 英文字母和数字
    6 h! @8 k1 s5 J
  21.             @char LIKE '[a-zA-Z0-9]' OR
    ' U3 K' Z: A# n6 x) _) _. s! t
  22.             -- 允许的特殊符号3 G  d4 y' A7 Y
  23.             @char LIKE '[_ -]'+ }, Y' }' |! U' t4 {4 {( ~
  24.         ); g* w1 \& s/ o
  25.         BEGIN  y& L) R$ ]  g
  26.             SET @result = 1;8 G) E) |6 q- r% S# S+ y3 F, W. A
  27.             BREAK;
    $ M2 ^2 @7 p" h- M3 s5 K
  28.         END$ M8 C1 {/ H2 _6 m. ^9 u  [
  29.         
    4 X* X3 W* _! e  y, o& U9 P- {) z
  30.         SET @i = @i + 1;) M  i' o+ K: E  R* Z" D" F
  31.     END;1 {% L7 o2 y9 d/ h4 v4 j6 y: Y5 ?
  32.    
    ; N- b2 T) v! ?
  33.     -- 检查是否在非法名称列表中) N# S2 V" Y9 g& y" z
  34.     IF EXISTS (. \: h! ?' p% E( a
  35.         SELECT 1 1 z9 {" G' ~; P% d! I
  36.         FROM dbo.illegal_character_names
    4 A8 E0 G) m9 @  l" v" G& \: v4 x
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    , V9 \& C  {. U  i$ g. |$ k
  38.     )  ]0 X' R  }+ a2 C# d# x; N
  39.         SET @result = 1;
    . M1 l9 y+ H2 O; A; u) D5 ]4 T
  40.     0 j9 H' i: i$ b2 B6 D
  41.     RETURN @result;
      g& s) k9 ]$ _6 v3 H( n
  42. END</span># ^4 K& I9 s8 \) R) D$ S0 j
复制代码
插入屏蔽的字符
, g, F, Q# z% B6 X  Q8 ?3 H
  1. -- 插入非法名称列表(明确列名并使用N前缀)0 d3 J- J1 ~8 a/ K" X. T4 \% L
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');* t, n( R* q. M8 L
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');$ t5 M$ |9 Q) i# h& L
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');6 n2 R0 T& f/ C% E8 W8 J5 `2 G
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');. U" i; f! e0 W  J# i! j( ]
  6. 4 \4 }$ c* v( A9 u" E$ w
  7. -- 示例:查询包含敏感词的角色名' g7 D- Q2 _) R2 J/ n& b$ i
  8. SELECT * ; F2 _0 x" m, Y9 g
  9. FROM dbo.characters
    5 H( a* _0 k; G
  10. WHERE EXISTS (
    : C; Y8 S: T! ?0 m0 g% f8 H
  11.     SELECT 1
    ( c! C8 j3 h( S- S
  12.     FROM dbo.illegal_character_names
    9 w5 g; ?9 u* F' h
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    % ^+ d' @  D& {# m
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
# H, y0 o; w1 _& J! W原始为:
; Z, d9 U$ z' g* N
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT: g4 Q6 a6 }' c

  2. ; i. F, m5 _- P) X* i  {1 D9 B
  3. IF @v_ret < 0 ( S& c$ L, J) F, E8 ?& `6 [
  4. BEGIN* x: \  B. Z! M4 M, i8 \# F
  5. SET @sp_rtn = @v_ret
    0 |6 {1 W! Y! S
  6. RETURN0 I7 _4 _- }$ j1 M
  7. END
复制代码
修改为:
+ |: y! D2 @' }) m) P1 a
  1. IF (dbo.NameBlock(@character_name) = 1)
    ; z$ R1 [' `3 L; E* m$ f8 y
  2. BEGIN
    1 [+ \$ D8 m; f- @1 G% Y
  3. SET @sp_rtn = -12- F0 [% `' n# t
  4. RETURN
    / ~8 ?3 P7 n% z0 t
  5. END
复制代码
% z3 b! m" F( }, w, H* q" {
% k' f8 L# V% z) H' {# k

- [/ }+ E! I2 U5 F5 T

6 [) |8 c6 [9 U: ?0 x
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-1-1 15:03 , Processed in 0.079088 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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