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

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

[复制链接]

153

主题

333

回帖

5692

积分

管理员

积分
5692
金钱
1793
贡献
3413
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表: K+ w% C# T8 ^' ?
8 v. t  H% A" R$ C7 L- W7 R
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数4 v) |* n! g' z5 m+ o4 q) V
  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 (
    % f% `, x! V4 l! L5 P' @
  2.     @character_name NVARCHAR(40)
    ( R% U. Y7 E/ x+ A+ X# D/ ~# x0 V. W
  3. )1 K+ V( P" E! x6 x( t
  4. RETURNS TINYINT
    / ?% o- |9 w, e
  5. AS9 h6 E" y, E2 ?/ b5 {
  6. BEGIN, p. U& B  g3 Y# ^* v
  7.     DECLARE @result TINYINT = 0;+ a( `" k# W4 W: ?
  8.     DECLARE @char NVARCHAR(1);
    : K( W8 `) n3 {# J
  9.     DECLARE @i INT = 1;6 r3 Q5 ?: \% z
  10.    
    - _9 E8 ~8 h1 W) I' A
  11.     -- 遍历每个字符,检查是否合法, g: q& Q0 ?- w( s
  12.     WHILE @i <= LEN(@character_name)7 V( \# K- @7 l+ J
  13.     BEGIN7 X. F4 Z* w4 ~3 R
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    4 d4 u- X6 h6 H% ^+ l
  15.         
    * s6 I7 m9 L# W: ~8 d
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    ! {* Q( s- D+ O' ~, Z' `/ F, B
  17.         IF NOT (" j1 a9 V! t! P$ O& I7 J
  18.             -- 中文字符范围 (基本多文种平面); B" o2 L  b3 W& Z' S3 R. Y
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    . ]  h: J8 [2 ~% P4 N+ h
  20.             -- 英文字母和数字
    * S1 m3 X2 x/ @) T7 y1 T
  21.             @char LIKE '[a-zA-Z0-9]' OR" R- C( H1 O' I% r( O3 J, n
  22.             -- 允许的特殊符号. r; [; D& D8 G, Q4 g/ C
  23.             @char LIKE '[_ -]'
    & ^0 U2 J0 K" H) ~, g0 R+ G
  24.         )* o, Q: w5 k8 {1 j5 A7 K
  25.         BEGIN
    9 B0 E$ @4 u) ~  Y2 _  n! y
  26.             SET @result = 1;
    & B4 `3 U6 J6 x2 L+ ]8 q
  27.             BREAK;
    & ], W4 e, l9 ?1 ~9 O- g* C
  28.         END
    5 P6 G1 E$ s( Z! }" H
  29.         
    & E, \2 j8 [' Q5 E
  30.         SET @i = @i + 1;
    3 E7 ^% q% I: U2 [5 s
  31.     END;0 w1 C! I) p8 V- i, S
  32.     # I8 O, h8 e' K; r8 s
  33.     -- 检查是否在非法名称列表中# @3 A6 o2 H  G2 ^& s
  34.     IF EXISTS (
    * t2 r! F/ d' w: E* o
  35.         SELECT 1
    6 k2 D2 T. D# [
  36.         FROM dbo.illegal_character_names 3 P6 r! W# }5 _8 ?7 W
  37.         WHERE @character_name LIKE '%' + partial_name + '%'! v" r( p1 e$ S' e# X  ]
  38.     )
    ( f9 `# Y1 P2 _: M+ p$ o: e) L* ?
  39.         SET @result = 1;) `; b( a5 j( B/ l5 w
  40.     ) D" H" }, N; s8 w* Q
  41.     RETURN @result;$ G1 U8 r6 n! k7 k
  42. END</span>
    6 M2 L. e+ X- z" I9 ^7 _* z
复制代码
插入屏蔽的字符
9 \6 M' x# |3 Y9 p5 {" ^1 H! c" O
  1. -- 插入非法名称列表(明确列名并使用N前缀)1 D* y( ?9 Z) H0 k# c2 j1 m: l8 q/ F
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');7 p7 M) N6 ?* g) |. e. Y( e3 \+ y
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');- D/ @/ p/ T' r0 a
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');5 z/ ]- T5 M; v6 F1 f: V6 q
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    0 ?7 ]0 b9 S% U  j% v% J, o* N* f

  6. " h8 s- e1 G/ ~8 ~; ~' g
  7. -- 示例:查询包含敏感词的角色名0 {  Z. n9 g! P6 L# U- U) T7 ~
  8. SELECT * 1 _; O# @0 B/ R3 A
  9. FROM dbo.characters
    & S7 z; n6 R1 P3 l! r/ H) w& V4 r
  10. WHERE EXISTS (5 v& O+ ]& t! p7 z( V, P
  11.     SELECT 1
    ) j6 R" w2 p. ?5 B6 J! a
  12.     FROM dbo.illegal_character_names
    # ?; Y/ K1 ]. l6 x
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    & W8 U5 D, H5 C% {) Z7 @
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
& Q, S  q' X! h1 ~" ~) W原始为:
: Y# b+ Q" ^3 H+ ^0 v
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT0 d( j& p! F# ?& i4 C3 p& \

  2. . f+ E) h0 g2 n8 q
  3. IF @v_ret < 0
    , J' M% \* ?: w: h# ?
  4. BEGIN
    7 c$ H4 t  }- }  J
  5. SET @sp_rtn = @v_ret' K/ I. W' R. }7 B& z8 T2 z
  6. RETURN. c  [0 @3 X. j& C+ X" B- R0 l# y
  7. END
复制代码
修改为:
2 R3 \, L' j7 `3 F" J8 L4 S$ o
  1. IF (dbo.NameBlock(@character_name) = 1)5 Q5 {* D& |" C
  2. BEGIN& d/ x- G( s; q) }& v$ {
  3. SET @sp_rtn = -12
    ) e: u! d& C3 f, i/ `
  4. RETURN
    ! `) o& D$ M8 B9 y- g- D% \
  5. END
复制代码

& m- C8 x& I- V. h4 m( o  p5 g& i0 t. J7 t1 L- A

/ _( k5 M/ _/ n1 e) ~

0 X  w; h0 A$ c2 q  p
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2025-11-17 15:32 , Processed in 0.049134 second(s), 26 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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