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

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

[复制链接]

157

主题

367

回帖

7122

积分

管理员

积分
7122
金钱
2045
贡献
4553
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
' ^/ W1 l0 n; T( S" f) w' Y1 @2 R6 G+ }4 Y4 _; v$ j. `
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数: j+ _# }& K7 Q7 r$ ]& S# N- s
  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 ($ ^" K) v0 T5 v5 p3 N
  2.     @character_name NVARCHAR(40)5 M' @, ^- P1 \0 w
  3. )
    2 @- Q4 Y9 Z: }
  4. RETURNS TINYINT
    & p5 f( D# C  ?% [
  5. AS7 o" ?  n# z5 P. d6 |9 L
  6. BEGIN
    5 [) e9 c( V, u& X, g; C
  7.     DECLARE @result TINYINT = 0;: s2 i+ p& U3 L% p  A! \9 Y- C1 @
  8.     DECLARE @char NVARCHAR(1);1 r* S" I& q6 O: O2 Q* R
  9.     DECLARE @i INT = 1;
    + f1 E. N% _4 u( t4 k7 ?/ o( g$ q8 R
  10.     & \' W* l6 W8 k- ^2 T% ~* \
  11.     -- 遍历每个字符,检查是否合法+ Y  B( \; E5 X: C9 u
  12.     WHILE @i <= LEN(@character_name)
    0 U" c/ w4 Q/ K
  13.     BEGIN
    - l6 a6 A4 ^  j
  14.         SET @char = SUBSTRING(@character_name, @i, 1);, j3 g7 [" A- T9 H: U
  15.           K& j: X7 ?: c0 Z
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号2 G2 N. \) w+ Z, b  t& P3 a
  17.         IF NOT (
    $ Y* ]3 S" ~/ ~; U! X( a4 B
  18.             -- 中文字符范围 (基本多文种平面)& l, F3 [0 B# v$ |: ~
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    5 m" s3 B6 m& t3 y& h1 E
  20.             -- 英文字母和数字) Q; C2 V+ b4 x8 [: S
  21.             @char LIKE '[a-zA-Z0-9]' OR7 g5 B" z) q. g. r$ d
  22.             -- 允许的特殊符号
    ( S7 N) O# q4 |2 }1 i) _. f4 ^& }
  23.             @char LIKE '[_ -]'0 r, m7 s/ T1 ~9 n- e4 @
  24.         )# A" T5 g; V! n0 J- e2 {$ N, s
  25.         BEGIN
    6 [) q/ C# Y9 `# Z' F# {
  26.             SET @result = 1;
    $ _" ^4 X: }& E2 U& J7 k. C2 T, o
  27.             BREAK;
    ( C; N5 B2 T3 D* [/ [' J
  28.         END
      Z# y/ W: C4 d/ `5 F
  29.         ( d! o% d+ |( l( Z
  30.         SET @i = @i + 1;" x) L  ~2 \/ _. Q) v3 J% o' N
  31.     END;* h5 M1 B; b8 N, j+ T7 t% ^3 Z
  32.    
    4 \/ Q8 \: X$ ?/ d/ {! u5 M: b
  33.     -- 检查是否在非法名称列表中
    ! R* X. A* w# Y8 H- y  Z! m" d
  34.     IF EXISTS (
    ; d5 V% Q1 A/ ~( f/ g
  35.         SELECT 1
    ; U, V7 C, {1 H7 s. q5 I7 Y+ u
  36.         FROM dbo.illegal_character_names + I5 m6 w4 L  e
  37.         WHERE @character_name LIKE '%' + partial_name + '%'; P9 S4 I( l7 ]( t- E1 m6 j- W. X
  38.     )
    2 h' ~6 L0 u% S9 t0 `
  39.         SET @result = 1;
    1 w9 \) C5 p& Y  s4 G' z7 g7 [
  40.    
    4 \6 X3 |3 {/ q- {. {: e* K( M0 l
  41.     RETURN @result;
    ; U* q# g% p: l% k* v
  42. END</span>  P! w. {. U* [) E8 m/ L
复制代码
插入屏蔽的字符9 v% i6 B; l. [
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    / H) w! t& h4 s( d0 U8 f8 E! H
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    ; Q' s1 Q3 J0 N; r6 G% P* @' F+ {2 L
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    - f: h! t( i2 c# Q) J, Q1 W6 d  d/ q
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    - D' b: w! \& h3 r) j
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');" u  S8 X) W2 ^" C! ]9 n
  6. 9 W) D% d6 I; J3 p
  7. -- 示例:查询包含敏感词的角色名
    ' j( J$ l# R+ M" ~: _4 w$ M
  8. SELECT *
    ; b/ U' }6 o. Z
  9. FROM dbo.characters
    ) M$ U( S/ z' H8 f" e
  10. WHERE EXISTS (7 @, f7 y5 w6 C) }" z0 h
  11.     SELECT 1
    5 c- f" }8 p2 s& s; H% V# k
  12.     FROM dbo.illegal_character_names
    ' c3 \% J  E( A! q* f" e
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    : X0 L& X8 K4 N! D
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据/ _/ S# P4 E5 z& C7 O, a: V5 E
原始为:
- }, a) d: o. v, v
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT9 g( C& [( q+ ^& N% `
  2. 5 J# V" b6 Z. Z% k: }  q( I- W( v
  3. IF @v_ret < 0
    * n( I4 c4 S" K! h5 R
  4. BEGIN
    5 c$ m5 w  h& b. P: Z
  5. SET @sp_rtn = @v_ret
      }8 \% _- ]( F: t9 a
  6. RETURN
    6 O/ M9 p+ |. u7 _
  7. END
复制代码
修改为:) J& @' S2 G2 g2 q# L
  1. IF (dbo.NameBlock(@character_name) = 1)5 s( l. n! e4 o- h& n
  2. BEGIN
    ' w3 B$ _0 H2 Y5 H8 ?( W
  3. SET @sp_rtn = -12
    " W7 k* c- ~7 f+ L4 i
  4. RETURN
    3 t' L9 ~  t7 c% F
  5. END
复制代码

) V4 h& y3 n/ H& q* t! D6 l3 Y5 S) S7 m/ I- z: j

) n  @2 A) a4 A; f5 z9 o" Y, n
, J+ E: ~7 E# z; }# c0 K9 U2 G
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-4-3 14:40 , Processed in 0.042799 second(s), 28 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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