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

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

[复制链接]

155

主题

348

回帖

6179

积分

管理员

积分
6179
金钱
1868
贡献
3808
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
. U( F2 I; Y% x  y  n" i. l6 @; s9 a, o
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数, n9 m: U( j. p( c6 N/ ^
  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 () T! R) U! A/ R  e* S
  2.     @character_name NVARCHAR(40)$ g$ V0 V+ V- j% D/ s
  3. )4 ?* N# x- v7 ]2 R6 n
  4. RETURNS TINYINT
    $ W# N% T- p8 W/ V. ^7 ]
  5. AS
    * g! D+ |& c7 o; i3 t
  6. BEGIN- Z4 Y/ @5 j$ n1 k8 v6 X; R
  7.     DECLARE @result TINYINT = 0;
      ?2 y$ q+ q  R  \) w/ ]& P4 }
  8.     DECLARE @char NVARCHAR(1);" D8 W  K* `# \1 g
  9.     DECLARE @i INT = 1;
    4 H) o5 J# M, b; `, N/ Q) J, [/ @9 Q
  10.     : \' l( t1 e" h% @1 N4 R+ U
  11.     -- 遍历每个字符,检查是否合法' ?2 S) E' s# R1 i  A% h& U5 q
  12.     WHILE @i <= LEN(@character_name)  D# N  j: A8 q1 T8 N, f
  13.     BEGIN5 o. I% r5 @' \2 J/ X5 E* Z
  14.         SET @char = SUBSTRING(@character_name, @i, 1);5 r! B1 H3 w$ r# P, {
  15.         " U: @  W/ e8 L2 P% F
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号# c- B7 z8 A) L2 m0 h
  17.         IF NOT (
    1 a; @1 Y' B" [, }1 C
  18.             -- 中文字符范围 (基本多文种平面)
    " W$ }4 h+ l( o# U. b
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    - ?4 h) v6 u7 z5 G7 h; d
  20.             -- 英文字母和数字- k7 V! H& r1 \  D8 M* m
  21.             @char LIKE '[a-zA-Z0-9]' OR
    : @# h& T1 D1 }5 j$ E' m
  22.             -- 允许的特殊符号
    # K" k3 g4 `0 m4 ?' k- ]6 V: b
  23.             @char LIKE '[_ -]'
    : Y. }3 H$ F5 s* O0 r( A7 X9 Z
  24.         )8 f0 R, e+ ^: m% Z9 p/ e. n9 c& l; f( G
  25.         BEGIN
    + A2 B- g. i) H
  26.             SET @result = 1;
    $ i4 r( J" Y6 @
  27.             BREAK;
      S' S# G' ~4 k1 z9 @
  28.         END. m- h. d& G/ u+ v  H
  29.         9 @9 }8 {5 U5 p1 G7 b' m  u* ^
  30.         SET @i = @i + 1;' \; ^; W! g; \- a
  31.     END;, x3 i0 ?" F5 C3 V  c% Q% J; D
  32.    
    9 t9 }$ s+ u6 u8 ]( T, G% Q+ c
  33.     -- 检查是否在非法名称列表中
    9 G# B6 h9 |; _% N
  34.     IF EXISTS (
    6 X! \8 O6 @$ a, O2 ]% v
  35.         SELECT 1
    % ?- K- {/ j! h2 u  X
  36.         FROM dbo.illegal_character_names ' {# {/ Q7 ]# k
  37.         WHERE @character_name LIKE '%' + partial_name + '%'" x! Z9 {  W! H" u
  38.     )
    ; W4 ?/ p+ N8 h# ]( T
  39.         SET @result = 1;% F0 H5 m8 p/ ^9 B9 z. {  z( H
  40.    
    1 u2 A' M0 ^4 G
  41.     RETURN @result;
    . I. S* E; B9 B0 Y: N
  42. END</span>
    2 T2 i( \' q1 E1 O7 y
复制代码
插入屏蔽的字符
2 D; z, G% H% a' @
  1. -- 插入非法名称列表(明确列名并使用N前缀): l& G& a/ r7 h7 f3 X* P0 _# q- y# }  ^- M
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');2 Q/ q% `) P- _2 J. \! }  |! W9 x4 Y' J
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    * A4 o0 D& i5 S& H! g5 h0 N
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    8 ~6 R8 W8 {- E+ p0 R( U9 _# z& F
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');1 s* L. s9 M0 x  H" i
  6. # |" Z3 R+ g1 G1 U& r7 N
  7. -- 示例:查询包含敏感词的角色名
    % k. V, d# ~% n" J; D
  8. SELECT *
    ; ^, K) P  X5 Z; M7 T& g
  9. FROM dbo.characters
    4 A4 F: |+ R/ V' Q* |
  10. WHERE EXISTS (! G  ?$ f* G6 i$ e9 N
  11.     SELECT 1 6 ~5 L% ^3 L2 Y6 ~: [8 g; j, J
  12.     FROM dbo.illegal_character_names
    / R' F7 f6 h1 b3 f/ U9 u& B9 B; u
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'1 P7 Q+ u& H; T
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
/ c+ E7 Q  }4 l/ Y/ r8 A# b9 Y原始为:4 K1 A- B2 ^$ b1 ]" y0 i8 c
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT6 @9 N4 E' s7 ]

  2. " A& Q* x; Y* p: N2 v
  3. IF @v_ret < 0
    9 x) a8 u! o3 m9 |
  4. BEGIN$ |2 H' |& }+ n% G
  5. SET @sp_rtn = @v_ret
    4 {; {. N7 E+ y
  6. RETURN; I. |: G6 P/ m, ^0 k
  7. END
复制代码
修改为:  s( ~# ^0 G8 L8 \
  1. IF (dbo.NameBlock(@character_name) = 1)
    8 \2 f/ X! ~) s% Z- I4 b
  2. BEGIN, X- ^2 c9 ~) B) v6 y, v: f
  3. SET @sp_rtn = -12
    7 w" O3 L8 @6 i% q
  4. RETURN
    ' E/ O9 N- B1 x2 P4 e
  5. END
复制代码

# B% b! |+ ]' `! i& i( x" ~# O4 j: L/ w- w3 S( k
/ D" s0 A% C9 y$ _) y4 q
- a* h/ A: M% K7 m% J
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-1-2 00:05 , Processed in 0.064519 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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