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

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

[复制链接]

156

主题

355

回帖

6601

积分

管理员

积分
6601
金钱
1915
贡献
4175
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
7 k5 z: E0 ?# \0 k, p6 |) s3 J5 y) y( D0 H$ W9 I% I
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
" p4 ~4 o8 I; o6 ^$ k
  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 (, X& J9 ]- N8 ]5 Y* ?! B* H
  2.     @character_name NVARCHAR(40)
    . t+ `; c1 Y+ V4 ?$ @# \& X
  3. )
    $ V2 @% A2 `1 ~+ s
  4. RETURNS TINYINT
    7 D4 C3 o; O. ], A1 F' W
  5. AS
    + e( f4 b0 y7 X3 Z$ y) b& i
  6. BEGIN& q* w0 S2 W! B/ w6 U3 l# R  t
  7.     DECLARE @result TINYINT = 0;
    7 N$ y  A4 ^8 b
  8.     DECLARE @char NVARCHAR(1);
    / u$ {% R4 G, y( P- ?1 D9 D
  9.     DECLARE @i INT = 1;
    # n1 ^! L6 Q$ E+ t/ p
  10.    
    % r7 b+ h0 k5 b& q+ G* Q$ l
  11.     -- 遍历每个字符,检查是否合法7 ]+ S' K. L, g5 y
  12.     WHILE @i <= LEN(@character_name)$ E9 j; M& h& E! Q5 N) G5 z
  13.     BEGIN
    + _+ d3 r1 T" G6 X2 }8 @
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    : A% ]0 S" I5 x) d5 e/ i: F. [( A
  15.         
    5 d( p! E6 x- G. s. x5 u3 ~
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号+ @+ b% n1 D  @9 Q$ S# [
  17.         IF NOT (5 O+ T$ b4 D+ m- }* ^2 [! ]
  18.             -- 中文字符范围 (基本多文种平面)
    : ]- D& S) ?5 ^" {& O, `- r, m
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    # _9 @3 E+ q' f9 Z
  20.             -- 英文字母和数字
    + J" p+ [! O% s3 q' V. W
  21.             @char LIKE '[a-zA-Z0-9]' OR2 r# R9 s, P/ g2 K: A! w) n5 i  d8 T
  22.             -- 允许的特殊符号1 ?  V6 z; D1 H; m3 v
  23.             @char LIKE '[_ -]'* b2 M) n3 b* w
  24.         )7 N2 v9 ~# z4 C# h
  25.         BEGIN
    2 N+ m+ f  f! f& Q  I  T4 E2 O
  26.             SET @result = 1;1 ]0 L8 x2 q' A0 f
  27.             BREAK;; A6 K& Y7 V7 p7 D  ~8 `
  28.         END; o; G6 ^; t& ]8 C
  29.         * \/ ?5 d  m( G/ \& q0 R
  30.         SET @i = @i + 1;
    7 x+ H  y$ P7 P, l7 w( b
  31.     END;
    + Z8 J/ L  W$ \$ s1 A! v
  32.     1 V, {- \& n0 ?4 i5 C
  33.     -- 检查是否在非法名称列表中
    # D4 W$ {2 _7 H/ b9 d( e; E
  34.     IF EXISTS (
    + M% C1 q- B9 I
  35.         SELECT 1
    2 L' G+ L  G( b) ]& S6 v7 m
  36.         FROM dbo.illegal_character_names ; l5 b4 ^; B' _2 Y
  37.         WHERE @character_name LIKE '%' + partial_name + '%'; ^7 u  Z. |6 G  P
  38.     )" }6 h* B9 n, {
  39.         SET @result = 1;
    9 r" d4 C+ H8 E6 K1 I" |
  40.     . h) S, g. {3 a4 h, |
  41.     RETURN @result;: N" C! q  v, s( k" z
  42. END</span>2 B% y$ Q6 k# m$ p: t$ p1 J
复制代码
插入屏蔽的字符% F/ |* Q: x# m. n6 @. x5 z
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    * U/ x0 Z$ K/ K$ I" \# I' D
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    % m& W9 Z% _) c* D" j" Z
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');' e* T- \5 Z& {5 N2 z8 v& s5 L2 {
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');1 L, ]( y+ H: e/ |- W4 Z; ^% N3 P
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    " o6 D2 R8 @' S* I+ L; j

  6. ' W; ^4 v2 |% A6 W) @6 }! n" O+ v
  7. -- 示例:查询包含敏感词的角色名
    3 C8 C- [! G) j7 f; _8 N- v
  8. SELECT * ! g2 p. A0 f# Z" h5 r* O
  9. FROM dbo.characters * x+ \( e' F2 _" t( l* o
  10. WHERE EXISTS (
    ) q4 L( K" @# m7 z; \0 g" D
  11.     SELECT 1
    / {6 ]" ?; u: N, a- N% A4 z5 }
  12.     FROM dbo.illegal_character_names 9 H9 Z) U7 X0 L8 f- {& ]
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'" J) \. ^& e2 `: m' l
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据( g- h( Z% U4 i& Q7 T
原始为:3 I* n, h  q. d! O! w7 N# y
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    + _+ K/ q* `! X9 C: }/ @! f

  2. 7 _- `" c0 `  ?0 Z9 n( |2 e8 _
  3. IF @v_ret < 0 ' R( O$ @8 ]1 h6 `' ~7 C7 x
  4. BEGIN; |9 \1 z. _% y/ v
  5. SET @sp_rtn = @v_ret1 Z9 m/ V& F' ?+ Q, d  a! g! Y7 F
  6. RETURN/ p& }: [/ R! f- ?3 K
  7. END
复制代码
修改为:3 i0 ~8 F% T7 f6 ^% `. g
  1. IF (dbo.NameBlock(@character_name) = 1)0 v6 o- Q% v3 s
  2. BEGIN
    9 {' @3 i. G% p" E
  3. SET @sp_rtn = -120 g8 ~# i$ b5 {$ ~
  4. RETURN
    - n9 c1 l4 K$ C! b/ {+ U" {
  5. END
复制代码
4 K9 X# Q+ K$ F+ B7 X' j
( [. i4 G  @) X8 j  @

- `$ Z' x6 ?/ S) p, d

) ?: I+ m5 s; }! Z; [- Q7 ~
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-1-30 02:35 , Processed in 0.069628 second(s), 26 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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