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

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

[复制链接]

157

主题

361

回帖

6821

积分

管理员

积分
6821
金钱
1939
贡献
4364
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表% |8 @  c7 B6 G7 d

" Q: w% L9 @; X/ r1 S# H4 ^0 ?
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
7 U/ s  m# J: C8 y% 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 (
    / ~! d  U5 j* L* E* Y0 I
  2.     @character_name NVARCHAR(40)% O; L+ R* |. }: d$ _
  3. )
    5 J0 h3 k. `- I: f
  4. RETURNS TINYINT- K4 v! ~* G2 h& Q) t& x
  5. AS* p' }$ t0 |( t6 b. U# c
  6. BEGIN  `6 U- D  o5 i: G, L( i" k
  7.     DECLARE @result TINYINT = 0;
    9 W. I% Y$ R  F
  8.     DECLARE @char NVARCHAR(1);$ O5 H, U" t7 x/ G5 q
  9.     DECLARE @i INT = 1;
      h' u6 c7 E  ]* w! {
  10.     0 _+ b/ @- G/ i6 w# |
  11.     -- 遍历每个字符,检查是否合法
    ) y/ x+ Z5 l0 v: b1 e* x
  12.     WHILE @i <= LEN(@character_name)
    + e8 \6 R4 |& l2 A( t- _5 Y
  13.     BEGIN
    . w1 }! c2 k+ A' o+ k
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    0 e# {! ^# n/ r+ ]' b
  15.         2 D: ]8 a8 q- E( N) M' y
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号% k1 \" ^  w; i4 s: c' U( p
  17.         IF NOT (
    $ j8 K" G6 z: a* E1 B" F) \
  18.             -- 中文字符范围 (基本多文种平面)
    1 n2 N/ X' T& _5 E% k1 S& u8 ]$ O
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR5 S9 o. r& _% \
  20.             -- 英文字母和数字; P0 p* U3 R% h/ B0 S* u* S8 n
  21.             @char LIKE '[a-zA-Z0-9]' OR
    " m  B2 i3 e4 m0 e& |: y
  22.             -- 允许的特殊符号
    ( }# g* J/ Y; G3 a  W0 s; Z
  23.             @char LIKE '[_ -]') G0 X# i- \7 B2 M4 H
  24.         )
    + H# Z) q' Z, U& q# U; B
  25.         BEGIN/ `8 j' @  W( j$ o- P9 d& f6 M
  26.             SET @result = 1;2 }# p6 a2 ^- m5 _
  27.             BREAK;6 [2 F4 z9 w# j$ ]8 m0 E8 T: ]
  28.         END& L2 q" ?& a$ h$ P3 O. V
  29.         
    ( a0 h' c% d  l
  30.         SET @i = @i + 1;
    8 N% Q" B' w& w' [' |9 t, I9 S$ v
  31.     END;
    ; `0 s# L, d; J" N' p$ v( }7 q0 k
  32.    
    ' a' @  f0 |' {" f
  33.     -- 检查是否在非法名称列表中# n8 G) p8 [: v
  34.     IF EXISTS (
    ) J6 X9 e# W6 \0 L
  35.         SELECT 1
    5 x0 K, U) h: |- X! f3 F3 g
  36.         FROM dbo.illegal_character_names ( J: O. |8 a# c
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
      b" R% m8 q6 P# {
  38.     )
    3 R8 {7 l' z. M5 T
  39.         SET @result = 1;, S! d9 G' m8 `
  40.     8 K7 Z; b6 J2 H# |: [  a
  41.     RETURN @result;
    4 w, y1 u; w- s* j! _
  42. END</span># x8 [8 G; V0 w* U7 m
复制代码
插入屏蔽的字符
! `; ]) K/ l3 p1 _! H- l3 I# p% O
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    ) h5 d( V1 O! Z; u0 z. y% T* D
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
      Y8 C0 F# W1 T, k. A; \: H2 h
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');3 N/ j, E4 s2 J  q  d; i
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');% m: a, A( t/ \' y* L
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    6 L" d& Z0 R5 e' b
  6. / B/ n; ^  {, n& G$ `6 a
  7. -- 示例:查询包含敏感词的角色名  X# T: h# b7 _: S0 |6 j8 \
  8. SELECT * + r  \% j! u1 A; A: Y# g& _8 a
  9. FROM dbo.characters
    , c% e4 z. \2 |+ K1 a* h6 z
  10. WHERE EXISTS (
    ) ], H" U) c4 f# J: Z* N
  11.     SELECT 1 3 }5 }* a' h! \2 ]2 l
  12.     FROM dbo.illegal_character_names ) z7 P( W6 J4 k  X* o5 S
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    $ ]3 k; @, c% x/ f0 p
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
2 }! s2 a5 z" ]' a+ A原始为:
+ |8 d- w% l) c" V9 w3 a
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT/ g# e6 M. [5 q

  2. ' I5 e2 p. x3 c% e- `, \
  3. IF @v_ret < 0
    3 `% O  [$ W% |2 W1 ^8 h
  4. BEGIN) v: p4 Y: X! y: \& G5 `6 P% Q
  5. SET @sp_rtn = @v_ret
    , l5 C9 r- h( N7 _9 y. @
  6. RETURN
    4 ~$ Z0 t, u2 z% n$ C; w
  7. END
复制代码
修改为:' R6 i# Y, q  {# l! D# R
  1. IF (dbo.NameBlock(@character_name) = 1)
    / Q( l2 V1 G( B1 V: i" K
  2. BEGIN2 I+ i9 y7 |* z1 K5 ~, r! V8 [
  3. SET @sp_rtn = -12
    0 S$ V; ~. ~9 a& C1 }
  4. RETURN# X1 c9 k0 J' q; m5 Q
  5. END
复制代码

, J+ s* c3 E8 p4 |8 M2 x, y  p; m$ d* l9 W$ X. J0 D- N9 D9 [

  q. v4 g# ^# O: X. N/ x* U. S# y
, A8 m8 v  L4 v6 n% H
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-2-12 05:16 , Processed in 0.058578 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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