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

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

[复制链接]

157

主题

367

回帖

7122

积分

管理员

积分
7122
金钱
2045
贡献
4553
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表1 E  o" p8 ~9 y, g6 Y
& r  Y. m  `4 z& v2 l- I% {
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
+ F1 v* P& s7 F9 ], B
  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 (
    % m" g7 K/ ?1 b. G# \) w1 t
  2.     @character_name NVARCHAR(40)
    9 d' E$ |6 a3 `: Q* t8 {* h
  3. )9 P# A0 a) w8 ~6 b8 \1 D9 w
  4. RETURNS TINYINT) O0 A+ G$ E% V" o. `- c
  5. AS
    # c7 K- t6 Y  D" ^' S$ u5 X
  6. BEGIN' Q7 l5 s/ t+ s& Y2 F' [; ~) q
  7.     DECLARE @result TINYINT = 0;. A& i5 j: U, K; c- X" E9 m
  8.     DECLARE @char NVARCHAR(1);
    1 A+ \8 g0 P3 O# f
  9.     DECLARE @i INT = 1;
    3 f5 E- b4 U  c2 r& z
  10.     8 u$ B1 I' K; L4 X! k. w  t
  11.     -- 遍历每个字符,检查是否合法
    4 S7 }3 V1 v' _) K, H
  12.     WHILE @i <= LEN(@character_name)4 C! E. v2 G# {0 n/ ]
  13.     BEGIN: _) H( E' u! \; D8 @
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    & d% ^/ _# e  X# G
  15.         / C" h, U4 ^( Y. L
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号3 J0 p7 V: U! K7 p) j& ?' e! t
  17.         IF NOT (" F3 M: H* N$ w1 `. F% \
  18.             -- 中文字符范围 (基本多文种平面)
    5 y9 P! Y- h7 w1 H( X* e" b3 ?) u
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    - D9 T9 ?1 p9 v* O; G
  20.             -- 英文字母和数字
    ' x1 a% f% ^  \9 I; B- ~! j: h/ n
  21.             @char LIKE '[a-zA-Z0-9]' OR
    9 T1 D; V2 m# H, x# L! u
  22.             -- 允许的特殊符号! m1 P' K+ }- Z! a
  23.             @char LIKE '[_ -]', G, u* z/ G7 Y3 c& U  R
  24.         )+ L& s! x6 _3 l8 u( C) n: b
  25.         BEGIN
    * r# ~$ |8 ?* m, l
  26.             SET @result = 1;
    0 o6 r1 v3 W3 b8 Q4 j7 t
  27.             BREAK;  Y. G3 X5 G% O) P- o/ U8 L
  28.         END
    ' g3 O. @; f  F1 R% |, n0 V
  29.         9 ^- Y" [3 \( _# u( p
  30.         SET @i = @i + 1;3 K; F) R8 t9 C# I2 X
  31.     END;
    4 a3 W1 R9 o' o9 H  _" C& x* l
  32.    
    " U- a; X, |: ~5 D2 [+ u( X0 e
  33.     -- 检查是否在非法名称列表中- w1 O: [0 ]) i  v1 U
  34.     IF EXISTS (
    / s& `0 e7 U+ _. b; ?: D4 P) O! q/ @
  35.         SELECT 1 8 x$ e* l1 _1 w. e- ~" W
  36.         FROM dbo.illegal_character_names
    8 d3 L2 l8 y8 ~& L6 B) }+ ]
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    8 T; Q2 I& y6 w& s7 d
  38.     )
    ( D4 O2 W6 Y, a
  39.         SET @result = 1;
    ; h- v8 w* u$ V$ R) f
  40.       a. t4 O2 r# q) ^" j3 P
  41.     RETURN @result;: O2 l, `2 A6 G* V& C) W( \
  42. END</span>
    ' P9 d7 ]/ ]5 Z9 Z  X" P
复制代码
插入屏蔽的字符
# e- n$ N, ]* V+ Q
  1. -- 插入非法名称列表(明确列名并使用N前缀)$ D; ?# R1 k( |- o
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    $ g0 y, C$ }' h. M% X+ A) q$ s# |
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');3 @' D  E# \2 d; x* r% V* z
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');/ D- D2 K9 u$ M
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');9 u; Z. p  b3 \7 ^9 Y' |" `
  6. 7 ?+ z: ^: k! D
  7. -- 示例:查询包含敏感词的角色名
    ) \% p( i' \- t, C  m) }
  8. SELECT * # V3 z4 t- S4 q3 v# d2 ~$ N6 g
  9. FROM dbo.characters
    ( X/ z; ?; i7 A- C0 b5 l
  10. WHERE EXISTS (# v& }7 f$ U; }/ x
  11.     SELECT 1
    ) A) Q! G$ Y% A# K# c
  12.     FROM dbo.illegal_character_names * i2 Q/ f, E% f. }% S- a2 M
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    " V0 N1 I$ J- `2 N4 a
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
# X4 U& |; J) M1 r+ n原始为:' `/ A& c7 ~% A" W
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT9 B+ O$ v! ?- F: d& F1 X  Q

  2. ' C: \2 t5 t9 ?2 ~) K) }  f
  3. IF @v_ret < 0   W, H6 ^8 W: k) e$ I, }4 r) z$ ]4 d$ a, W
  4. BEGIN4 t4 ?& K# y" e/ m
  5. SET @sp_rtn = @v_ret
    % R+ Z( [6 D  M4 N( T- E' D
  6. RETURN  Q8 C( l  S! M0 g  {
  7. END
复制代码
修改为:5 o$ @! v5 n, P% l6 G! _* L
  1. IF (dbo.NameBlock(@character_name) = 1)
    / u& z) |' L7 s5 \  T$ s
  2. BEGIN3 {1 t6 L% `6 l9 J' Y
  3. SET @sp_rtn = -12
    5 Z) K' F' [8 p+ R! x+ S- h
  4. RETURN
    9 N! k' E1 g$ O. a5 Q/ U) S+ g
  5. END
复制代码

' @& k7 ]+ |( A4 Q* t; f# f" h/ b3 b+ N5 f
2 ?( k# a4 U; e: N8 P  U0 i
6 j# [& S/ G0 W% [
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-4-5 21:54 , Processed in 0.047278 second(s), 28 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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