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

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

[复制链接]

161

主题

397

回帖

7590

积分

管理员

积分
7590
金钱
2201
贡献
4831
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表' C4 X; y( _2 T* C1 f, X
* U% v$ M" p5 a# V
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
+ S. d; I( w8 m' D; y: L7 r. ]
  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 (: d' g# Q- T$ U
  2.     @character_name NVARCHAR(40)8 Y& k1 i" R: l# H+ E
  3. )8 s6 {, O) }( d, i5 A7 P
  4. RETURNS TINYINT
    ' U9 J, F2 Q8 o. y! D/ H# |, n
  5. AS
    6 {* x! x' [% s' ~5 p/ h
  6. BEGIN# d" `# }2 F" C, h& y. _5 f
  7.     DECLARE @result TINYINT = 0;- X8 L2 m7 z2 D, x0 `& w, o) b: O0 B
  8.     DECLARE @char NVARCHAR(1);
      D( p) d- O$ c8 {" G9 z' f
  9.     DECLARE @i INT = 1;! a% `1 c1 S% M! x  b
  10.    
    ; ?: w4 M- L  t; k
  11.     -- 遍历每个字符,检查是否合法
    * o0 I* M; p6 K. L; a  X
  12.     WHILE @i <= LEN(@character_name)
    ! }& H; I& n* l4 ?3 K
  13.     BEGIN
    0 b6 }, Y6 r# r( W' E. g" e% o
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
      U/ M8 }) l: n8 P) E: i
  15.         
    ) x: q( e  h9 |1 c9 e
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号5 L6 m. Z. w% e+ E5 t
  17.         IF NOT (
    + I3 h- J2 }9 ^* _3 s2 {# c1 ]
  18.             -- 中文字符范围 (基本多文种平面)
    : |! x' P# ]5 h# u% Z8 R  A# z/ |
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR" o# Q; N1 G/ X. p7 Y
  20.             -- 英文字母和数字. O; \' m; v/ J$ X( |! V! R/ Z
  21.             @char LIKE '[a-zA-Z0-9]' OR
    " _9 T1 I+ H* E3 V6 c! k8 r
  22.             -- 允许的特殊符号
    1 A$ A* f: q- ^, l4 u
  23.             @char LIKE '[_ -]'5 T7 i6 h4 t6 v/ S# A5 {3 m# D
  24.         )
    2 q& p. b4 r$ F6 L
  25.         BEGIN
    6 j7 f+ g7 {$ @' M/ ^
  26.             SET @result = 1;' O' D* ^# K2 N) |' |. g8 _: E: P
  27.             BREAK;. I$ f# A/ y. q$ y5 T5 ]; _+ u
  28.         END# z0 A" ~( \+ ~# w5 ?
  29.         
    8 q9 E# ]. M+ |  `/ d! e5 R
  30.         SET @i = @i + 1;: C4 V9 o' d2 C/ A
  31.     END;
    ' E# k- }6 I9 x) l
  32.    
    $ X. k* z6 J+ o# w. Y0 h* g
  33.     -- 检查是否在非法名称列表中* w( A/ T% U3 u4 w  ~) y
  34.     IF EXISTS (
    5 o5 N; z6 w' u! q. B9 `4 Q
  35.         SELECT 1
    ! q( X0 R; W6 X
  36.         FROM dbo.illegal_character_names ( `! ]9 B4 F4 F* v* s
  37.         WHERE @character_name LIKE '%' + partial_name + '%'* t8 }: X' w8 I* R) f* t( d' T
  38.     ): c/ k! e  {8 F) k: g. Z( B
  39.         SET @result = 1;
    ! G1 w5 E8 U9 I: ~" ]( K  L; M" t
  40.     , K% ^% a0 c) G. H" R3 q% c) H
  41.     RETURN @result;
    3 l) K# `: \* `( t
  42. END</span>
    8 n& s( y3 q  _7 ?
复制代码
插入屏蔽的字符
- m3 b$ E: P# J# @: P/ F
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    : h( n# j, Y( ]2 c- M" Q8 V( W
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    , Y0 v! h  f5 w6 `) ]% h& z
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    % f! x: I6 ^  m$ k3 v7 P
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    ; F3 R, v) ]( [, M
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');' m( g( [& z& }3 }7 ~* \3 Z
  6. : t1 f4 [% m1 L; n9 Z. J
  7. -- 示例:查询包含敏感词的角色名
    % M# \( W$ t* I. W
  8. SELECT * / b- O! _: ]! b: P- S  i" [
  9. FROM dbo.characters
    . h% B+ L2 x* ~
  10. WHERE EXISTS (
    - m' ?! t% D; P1 N+ u- w1 o
  11.     SELECT 1 ( ?" v+ W( H+ F
  12.     FROM dbo.illegal_character_names $ k" d- K4 G' q) C8 F
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'* I# H0 d% F5 w, k
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
; r# X2 p! U/ v2 m原始为:
. ^& x, h4 p, Q* d# `
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT: b% a8 I5 s: V  {( T9 v% P. y
  2. " u- ?! {" g: }5 W% p# M
  3. IF @v_ret < 0
    * Q& Y3 u2 z! X: r: y
  4. BEGIN0 U, c2 |0 d' J% p
  5. SET @sp_rtn = @v_ret! F7 d8 n* v" B8 K' n; W
  6. RETURN9 L/ d7 u; p, n0 O
  7. END
复制代码
修改为:+ b' Q* B9 ?" {+ E
  1. IF (dbo.NameBlock(@character_name) = 1)9 j) e$ d; C1 |$ \: W
  2. BEGIN
    2 Y/ g7 |7 m. H* U) a! K( x
  3. SET @sp_rtn = -12
    8 R7 v) ^8 z/ [
  4. RETURN/ k, [% D* f- e  g+ I
  5. END
复制代码
8 r/ [+ i4 W2 K. h
9 N. g, }3 F- L1 I/ n7 B
1 i0 P" Y, z  `8 `: O9 d

3 Z: ?/ F* s; d+ u! F# p
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-6-3 00:50 , Processed in 0.035815 second(s), 26 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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