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

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

[复制链接]

157

主题

367

回帖

7119

积分

管理员

积分
7119
金钱
2043
贡献
4552
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
. n9 O$ R- w; z" Q3 i" \$ h( l
  M- u! J  [+ i8 r
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
* h8 T- E; f1 T
  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 (
    5 s, M$ `* T+ u% @7 Y) q
  2.     @character_name NVARCHAR(40)
    # S3 y. x) I( P1 v
  3. )
    - }5 J0 S# H. c5 J( j$ P9 ~
  4. RETURNS TINYINT
    2 s% {! J* `8 s& q
  5. AS5 s( f) y( z3 b" p5 h
  6. BEGIN# P& }8 _5 H$ M. y
  7.     DECLARE @result TINYINT = 0;  W1 a$ i, C! N8 z+ [9 k0 U% x) y; f
  8.     DECLARE @char NVARCHAR(1);
    ! q, ]; }5 X# u: x
  9.     DECLARE @i INT = 1;( n1 V/ I8 `) m2 @7 g
  10.     8 _$ j- Z! m" u4 x1 q" C  P
  11.     -- 遍历每个字符,检查是否合法* D# H( g3 L: X3 X. p% g
  12.     WHILE @i <= LEN(@character_name)
    ! L5 ?' ~, e2 K% ^- t# Z( I, D
  13.     BEGIN8 W  L" B3 T$ J. N2 A, l
  14.         SET @char = SUBSTRING(@character_name, @i, 1);1 k: F5 {2 o& \0 Q5 J
  15.         2 t1 U6 e# E2 e4 j6 b- r
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    7 K8 ^- H$ L& W) C$ f( H1 d
  17.         IF NOT (
    " K+ o/ F9 g' |
  18.             -- 中文字符范围 (基本多文种平面)
    0 z% i  o7 t* m1 U$ \# d
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    * N' [7 I: I5 j1 J
  20.             -- 英文字母和数字
    6 h) B, O8 T. H9 A) {5 {
  21.             @char LIKE '[a-zA-Z0-9]' OR
    , s' q% h0 ~2 m/ t
  22.             -- 允许的特殊符号  m% b" `. [' T. M7 W* ~# D6 a4 G
  23.             @char LIKE '[_ -]'3 m# T" w1 H+ x/ W
  24.         )
    $ _# {" U: q) |. S7 A+ n- t- k
  25.         BEGIN3 x+ O3 ?; X1 f! m" a8 Z
  26.             SET @result = 1;$ m: d3 _: v- X# g
  27.             BREAK;
    0 U' m) Z" w9 b4 {( P/ O" r+ b, U
  28.         END/ s! Z  X0 W: p; u- {, t$ P
  29.         
    $ J3 B! i9 P- T) Q" {8 c/ O! D. @6 Z) ]
  30.         SET @i = @i + 1;* [' C6 e" N& C; R- j- U, A
  31.     END;; B9 ]7 e! m! ~# J" w# ]
  32.    
    . U+ ^9 ^: X, o( k  r
  33.     -- 检查是否在非法名称列表中
    8 g1 B. ^, h6 O- G
  34.     IF EXISTS (# t5 _8 o. A4 _0 ]' A5 F; F
  35.         SELECT 1 5 s8 n+ P& ~% i9 e; }
  36.         FROM dbo.illegal_character_names $ z! }: z( _' L+ ?7 ]% j1 |
  37.         WHERE @character_name LIKE '%' + partial_name + '%'' ?; `" U% r% o5 N" W
  38.     )# _( j0 `: e& h2 c+ B" @
  39.         SET @result = 1;0 h# m6 U+ `& Q8 ?
  40.     & A9 P3 }" d, C" Z( `8 H
  41.     RETURN @result;
    ! Y4 b" {! }/ {% N0 M! O
  42. END</span>
    , H' n1 F/ W) G0 t0 b/ _5 O
复制代码
插入屏蔽的字符
) t0 j: d! r: h' m* F/ I6 H' }
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    & F5 H$ I" G7 W7 Q, h7 P- m
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');9 V2 h" g- Y9 ?0 h2 a9 }
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');, _0 c0 ~: V$ W- `  G( k
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    $ p5 t) v5 A1 B" M# J. }; z
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    & V- {, \6 N3 Z1 l+ ^# h' n
  6. - _7 ]7 T' s* C3 i
  7. -- 示例:查询包含敏感词的角色名. }. e) e" i2 @0 A7 y( d
  8. SELECT *
    2 t! O4 T# [* |. R- H
  9. FROM dbo.characters ( N( t- U$ t- {% D0 a
  10. WHERE EXISTS (
    5 w" q5 H2 a$ w$ _3 k2 u  e
  11.     SELECT 1
    ! \& t, B6 P3 F  L9 f( W# ?
  12.     FROM dbo.illegal_character_names 3 f( m% d/ V1 \" T% X3 M
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%': e, h2 T( N4 U# u! I5 v
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据0 K9 m) P: X' T5 q5 t  T7 |( [
原始为:. e, V! z. z0 c8 b
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    ) y+ I# H. W: M9 x

  2. 9 v8 g: d3 I7 ]  _- Y0 f( z
  3. IF @v_ret < 0 0 u* m/ }9 F$ t+ ]7 B$ A) C8 t
  4. BEGIN
    % d, d8 n& g0 c$ v6 I2 @+ V# E/ [
  5. SET @sp_rtn = @v_ret; F  N& h6 D0 {9 `" _- u0 w
  6. RETURN
    4 Y7 r, j. `* C- W+ k
  7. END
复制代码
修改为:
2 m3 R7 A+ y9 s; B. u
  1. IF (dbo.NameBlock(@character_name) = 1)
    : I" x* ], s+ ^; H3 {
  2. BEGIN* M5 O; E+ x7 j
  3. SET @sp_rtn = -12
    % A1 }0 G5 l9 K: o
  4. RETURN
    5 k# \3 a8 y3 D
  5. END
复制代码
4 Y* x$ |+ U& j0 g
* ?3 E2 g- F3 r: y2 w$ V  K5 [4 h

7 C' k5 Z  P6 J4 q

7 `/ ~  D; j* |9 @
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-4-3 06:52 , Processed in 0.040076 second(s), 28 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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