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

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

[复制链接]

157

主题

367

回帖

7119

积分

管理员

积分
7119
金钱
2043
贡献
4552
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表2 w' C8 {' X6 G+ f$ ~# C& c4 ?* z( r
9 R2 O# q$ m& F
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
: |: u4 J. r1 ^  S9 a* |9 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 (7 v6 G& A" v4 A8 j
  2.     @character_name NVARCHAR(40)
    . E& O; z4 W- z
  3. )4 c+ K- k9 P% k( R4 p8 k5 W8 }) h2 [
  4. RETURNS TINYINT7 w$ P- D* d9 G
  5. AS
    9 S3 K, ^7 g8 I
  6. BEGIN
    . E: u% u, u3 a8 s
  7.     DECLARE @result TINYINT = 0;2 g, p* u0 N8 ?2 ^* n
  8.     DECLARE @char NVARCHAR(1);
    2 P, C. l# ?& Y2 i1 S4 `3 T/ p
  9.     DECLARE @i INT = 1;8 E& ^; p9 t& C+ h! g0 h" R
  10.     + e8 c3 i6 g# q# k
  11.     -- 遍历每个字符,检查是否合法' {& r: J) O- H3 l
  12.     WHILE @i <= LEN(@character_name). \7 k4 S' N2 [$ f4 l
  13.     BEGIN
    ' K) o2 j0 X7 X; t9 R, h
  14.         SET @char = SUBSTRING(@character_name, @i, 1);2 l" Q8 i7 |. [. q
  15.         
    ) ~' {) G1 D) }4 m8 H6 U% }
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    ; X- F; V, _5 N: y
  17.         IF NOT (5 c4 U! c' u  y6 G+ V
  18.             -- 中文字符范围 (基本多文种平面)
    % v5 U) g: L. R  a6 L0 K
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR4 R8 A7 \3 T# d. D% Y" Y6 n
  20.             -- 英文字母和数字
    7 G. B' A' J  @) X
  21.             @char LIKE '[a-zA-Z0-9]' OR4 A8 Z& n( {3 [
  22.             -- 允许的特殊符号
    6 y3 K( |8 }1 t6 Q" j
  23.             @char LIKE '[_ -]'+ ]: T+ h0 q5 i8 e
  24.         ): F! ]/ }" f7 ^1 r, @; Y
  25.         BEGIN
    # D  i5 t' k* B0 a% E
  26.             SET @result = 1;3 T7 ^% b  F( y4 j# S
  27.             BREAK;: q7 @, S( P# \7 W6 B- r
  28.         END" h5 ~% L1 u: Z1 h3 O- }4 I
  29.         
    : ]. O+ Q/ ?* j9 ?9 j9 L
  30.         SET @i = @i + 1;
    4 l4 A% W# f" ]: b7 M5 b9 ^6 O
  31.     END;
    , p4 f4 C! r. @4 P1 m4 @1 ^* R
  32.     5 S$ h4 U: |0 X* V* {
  33.     -- 检查是否在非法名称列表中! o; \1 {4 [8 X' G+ i) l( T# ]
  34.     IF EXISTS (5 q! K6 h1 u3 `
  35.         SELECT 1 # S# ^  n8 t7 R2 m6 L9 B% z/ |4 G
  36.         FROM dbo.illegal_character_names
    + o" g0 z% O: Z, d( \8 s; A
  37.         WHERE @character_name LIKE '%' + partial_name + '%'* L' N! g, `7 O4 b
  38.     )
    ! {* |; N% |8 H0 K
  39.         SET @result = 1;4 M3 t" b8 s9 k. D  c+ R
  40.     ( S" w2 P/ w; U- R& e0 {. r
  41.     RETURN @result;
    2 m. {. j  u& y. x7 L: O1 b
  42. END</span>8 b4 u6 S3 y' k/ l
复制代码
插入屏蔽的字符2 k1 A5 B" F. b4 U9 q
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    + g" d5 a6 b' J  i% ]4 f5 W
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');2 t+ x- @! a4 v' v
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');; i: h$ s' G9 J& n
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');: q( o& V- Q8 T0 w$ D* U( V5 A
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    " J* y! Q' m' C' n4 u: a; p" l
  6. % k  w. |% P# A: Q) A# l! {4 e. V
  7. -- 示例:查询包含敏感词的角色名! e9 K2 I0 Q5 W0 b. w  w
  8. SELECT *
    3 N5 [# E7 f$ e8 ]
  9. FROM dbo.characters
    1 X1 W' Z6 s7 K
  10. WHERE EXISTS (0 n0 K  D) I6 x% r) I
  11.     SELECT 1 $ j' t, a/ j9 T, Z, ^
  12.     FROM dbo.illegal_character_names
      k$ U8 i0 Y3 W9 x
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    # q7 B/ ~+ b# ?& ?$ t
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
7 C1 O' j+ H/ O& o: j2 i% ?原始为:
( ?! C8 A9 T+ H! V1 d
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT) O5 o2 ~" O8 K, `( v

  2. # {7 I! [7 ^6 ?$ K2 R; [
  3. IF @v_ret < 0 6 A% S: R8 K& e& V) v& b: r) e& n
  4. BEGIN' q3 s4 B  ^1 s( |# g5 K
  5. SET @sp_rtn = @v_ret: X9 O6 v% r; ^+ Y
  6. RETURN
    ! B! V0 i3 k! |" W0 h1 G
  7. END
复制代码
修改为:  |9 f$ t: d6 E
  1. IF (dbo.NameBlock(@character_name) = 1)
    1 \( X- l5 {" @
  2. BEGIN) R9 `+ X; J9 w) e) h
  3. SET @sp_rtn = -12* K' }/ J' n4 Q1 C7 ]" F" ?4 G
  4. RETURN
    , O0 u# H! |# D/ P; n* R8 ?* i. z' \2 L
  5. END
复制代码
( h4 Z2 b2 B9 c4 Y
( s+ c5 o' K4 z" p- x
8 Y( Z) e( ^0 T
) N; G8 D9 M- Y: O$ x! _
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-4-3 06:53 , Processed in 0.032029 second(s), 26 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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