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

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

[复制链接]

154

主题

340

回帖

5829

积分

管理员

积分
5829
金钱
1830
贡献
3505
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
7 w/ Q4 u0 O1 `4 ]1 K7 R: W6 Z3 i" V3 O1 ]! m9 [4 ?- k
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
7 l/ R/ b2 q( p6 P
  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 (8 `' o4 a" U* O- Q- o. F& q
  2.     @character_name NVARCHAR(40)
    , N7 D4 b% @5 e3 C0 `
  3. )
    ' |3 ^) h" }' T+ Q/ S& a: f
  4. RETURNS TINYINT% V* e% d+ P# p6 c1 w
  5. AS, _/ H* j. q4 U$ Q1 ]. u0 q
  6. BEGIN4 f+ D% q  S2 u$ L
  7.     DECLARE @result TINYINT = 0;9 e. H1 Z4 w# r) \8 }
  8.     DECLARE @char NVARCHAR(1);. F2 b5 j9 Y/ k2 b" C, p/ K
  9.     DECLARE @i INT = 1;- W. a/ l, O8 D& g1 U+ q
  10.     " A" j8 v  {: m7 |3 E
  11.     -- 遍历每个字符,检查是否合法, e) Q" G7 R: W
  12.     WHILE @i <= LEN(@character_name), J3 o7 f. n) r: k
  13.     BEGIN
    & K( ~7 Q1 W# d( }' S5 x! J
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    ! O4 a7 }% X1 Q
  15.         
    2 ?& `( U( k; j4 J& V7 p: O1 t
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    7 O/ e! y& G7 s; _8 e1 D
  17.         IF NOT (. L  ~: L7 b. U) M/ ?
  18.             -- 中文字符范围 (基本多文种平面)
    " a' `4 B5 M6 P3 ?" P& U/ ?3 P# T
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR: Z( c" b) V; m  p: q% @' N
  20.             -- 英文字母和数字
    9 f/ p! t% L: ]+ y3 E# S6 {: X
  21.             @char LIKE '[a-zA-Z0-9]' OR
    1 [* W, K" N  H7 a
  22.             -- 允许的特殊符号# \/ z1 ?" M) h& j% Y: v
  23.             @char LIKE '[_ -]'
    3 c9 }) G  ~6 \  M/ A
  24.         )) d- N7 ]$ l, r. e
  25.         BEGIN) R- {3 E; O: k4 E' k& O
  26.             SET @result = 1;' D0 Q8 q% u, r( Z: J) L
  27.             BREAK;
    + @/ D* G" I9 d6 z# \0 E& Y
  28.         END$ Q" l& g7 t' `& I
  29.         / u8 d( [) M. K: [4 }* T9 T0 v
  30.         SET @i = @i + 1;* w7 e, |6 V6 c0 z
  31.     END;! g- k. g+ G- h4 {
  32.       @: N' B2 y, o) s6 C& b
  33.     -- 检查是否在非法名称列表中$ r/ D% O* v2 H. s" L- \
  34.     IF EXISTS (
    9 U7 o, y8 z! K" y; E
  35.         SELECT 1
    1 H( {4 A# T9 x) c6 y
  36.         FROM dbo.illegal_character_names
    9 ^( B0 b3 f9 f, q" c! z% H% g
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    ' o  ?$ L7 N$ D' [( n8 H1 ^' m
  38.     )& U+ ^7 d, r  j3 i! Q& b% t( o) r
  39.         SET @result = 1;. k/ w- M  X. d- m3 [: D
  40.     ' v8 I3 M+ d% x8 \. X
  41.     RETURN @result;
    0 r5 D/ r% V" u) Y, j( Q, H
  42. END</span>! j1 Q8 Y! D. S' {, k- ]5 _
复制代码
插入屏蔽的字符
/ L) F1 D5 c" @6 i
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    % X! |* S+ [1 |! D: q- m
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');4 x! W/ h: F, ^, H. y3 c
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');/ d& e. Q2 g. n+ ]
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');" y0 k/ y( v! R# f6 ]
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    9 ?& `  Z8 w3 F

  6. : q, X4 P0 n) w+ K/ }2 I
  7. -- 示例:查询包含敏感词的角色名" A- F" b: s7 g
  8. SELECT *
    2 p5 e5 n  F# c* @
  9. FROM dbo.characters
    1 W$ l" B+ S! h( s  Y5 B, ?* p
  10. WHERE EXISTS (( d; `0 b9 y1 v2 Z
  11.     SELECT 1   `$ Y1 a) j) V% p, a$ l
  12.     FROM dbo.illegal_character_names
    2 ^( B" P1 Y. [2 C, a3 B3 s# a
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    + ]  a  O# G2 ~0 Q
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
' h8 S8 s/ v( j6 s7 o5 q% N7 o原始为:6 W( F! Z8 }0 i5 |/ [' X0 f
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT/ l4 t+ P5 ^6 I

  2.   g! Z. ~7 i% A7 h9 ]. {9 `; C0 H2 P
  3. IF @v_ret < 0
    2 v  ?7 Y* {+ {/ Y9 F$ k4 ]
  4. BEGIN/ T1 q+ z+ ^+ q
  5. SET @sp_rtn = @v_ret5 S- P: \; l+ h" b2 v: `
  6. RETURN
    - Y: O+ G/ A8 s2 c3 G3 ^
  7. END
复制代码
修改为:
4 Z" o5 b/ |- V# Y& S8 P
  1. IF (dbo.NameBlock(@character_name) = 1)  D; t6 y2 d6 b1 S3 u+ E3 Z
  2. BEGIN2 a( g& ^6 p2 K1 Q8 n
  3. SET @sp_rtn = -12+ o" r: n& {! O
  4. RETURN/ W' D8 h  c' i6 ]7 [# K
  5. END
复制代码

+ B3 N/ |/ V6 G/ I8 s+ P
9 q5 ?" y* s' s% Q) A& _# ^+ u  D/ |2 k9 B5 W, @! u/ B& r2 a! F9 D

/ \: B* M, C9 ]  \. F
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2025-12-9 03:45 , Processed in 0.046751 second(s), 24 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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