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

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

[复制链接]

155

主题

348

回帖

6179

积分

管理员

积分
6179
金钱
1868
贡献
3808
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
% a; W9 B' }' o# r( `& V9 c% \( _# _, V5 O  H: R
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数8 E. d% \. N9 w4 A) D3 N4 }
  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 (
    ( T2 W* Q; `& X: N
  2.     @character_name NVARCHAR(40)+ q- g* }0 \2 A
  3. )
    2 L) k4 s- O" a; h4 }0 A1 H+ a
  4. RETURNS TINYINT
    ) |9 {, G  |- Q* A4 T
  5. AS0 E* p" [" q0 w
  6. BEGIN
      S2 n% [7 @" w; O! m: g
  7.     DECLARE @result TINYINT = 0;
    5 _4 k( Z) {' B/ w- N1 G
  8.     DECLARE @char NVARCHAR(1);7 F2 [$ v+ Y) ^) U! }- F& v5 s
  9.     DECLARE @i INT = 1;" ]7 w: s3 i) o; S, ~$ }' @
  10.     - U+ S) t" q0 A$ Y+ c
  11.     -- 遍历每个字符,检查是否合法
    9 {$ b9 K5 J9 P& J: M, ?  A
  12.     WHILE @i <= LEN(@character_name)
    2 v5 I2 w, ]2 v5 U2 F
  13.     BEGIN, q% K( D- @* n
  14.         SET @char = SUBSTRING(@character_name, @i, 1);0 X2 C! s! f1 b( w. s: E
  15.         / V5 W- z( Z; m* k- l% }) O9 Z4 A
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    : R4 _. F3 I# V
  17.         IF NOT (
    , M; d- Y4 t+ \; E9 p
  18.             -- 中文字符范围 (基本多文种平面)& B3 c0 ^" v8 J4 V1 `
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR6 ^. O) E" Z3 o' F
  20.             -- 英文字母和数字
    " h7 r  _2 ?+ }# o$ F5 p
  21.             @char LIKE '[a-zA-Z0-9]' OR
    - o" q* c) K3 B. Z+ C- a
  22.             -- 允许的特殊符号
    / [0 G' h: F! i8 {. u/ Q
  23.             @char LIKE '[_ -]'
    - S; i7 x; l0 W
  24.         )1 g) g7 |4 X, ?* v; K8 Y% P$ a
  25.         BEGIN
    * {, R) R. J8 Z) k) V) `
  26.             SET @result = 1;4 [3 s2 a" \% G/ e6 Q
  27.             BREAK;5 T# W% C3 \9 U$ `" }7 [
  28.         END3 X' N3 Q; M! U% ?) o3 z
  29.         , B! }! v6 Q; D/ `3 |5 R8 G/ B# u
  30.         SET @i = @i + 1;$ s$ T& x. n+ {
  31.     END;
    - W1 S# r4 p) s& t& T! S& {
  32.    
    ( M: a" s3 ?# v4 C! y
  33.     -- 检查是否在非法名称列表中
    6 x& x2 ]5 F9 K" j" b
  34.     IF EXISTS (. h2 I) _6 |% S
  35.         SELECT 1 " G( F* J' x% H5 A  {9 _9 `; C
  36.         FROM dbo.illegal_character_names
    . ~& H. _8 G- }1 n
  37.         WHERE @character_name LIKE '%' + partial_name + '%'; u7 f0 K6 _& {: d
  38.     )  A: m0 |0 ~- m8 m
  39.         SET @result = 1;/ X# T6 ^1 W+ i3 t7 ?
  40.     4 ^6 p8 G/ ], s: u
  41.     RETURN @result;
    5 B: j! `# \$ V) e4 z
  42. END</span>4 J: M1 S8 O5 W, P+ T- G7 p
复制代码
插入屏蔽的字符
+ e8 G0 ?+ M6 k0 u5 B" }6 l( H
  1. -- 插入非法名称列表(明确列名并使用N前缀)7 D) _6 b. m2 @
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');+ ?" S  q8 x1 F4 M1 U
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');" J% H  z- _$ O$ |
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    3 x! P0 L3 E( N& J8 w0 f
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');6 v* d" H$ C  ^; o0 v

  6. * p# O" `) r; o% P# l* m
  7. -- 示例:查询包含敏感词的角色名5 ?% K% K; W1 Z/ ~: V# ]  E
  8. SELECT *
    9 T* b8 C- ^6 x2 W: J* q: V! D
  9. FROM dbo.characters
    2 Z* ]! W6 m" M5 P
  10. WHERE EXISTS (
    5 `. \0 b) L3 @+ k3 J( v
  11.     SELECT 1 ; O# t  |& i6 |) X1 w4 F: ~* v6 a
  12.     FROM dbo.illegal_character_names
    # M9 K; z4 m; O
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    - y! b! {6 E2 U9 Z* K
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据) ?, \6 [/ y1 q
原始为:0 u# G8 \; k$ o
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
      C$ ]% n$ c1 z; v8 Z5 T/ k
  2. 3 n! G7 m5 F+ M% O. d1 \& f
  3. IF @v_ret < 0
    " R3 i5 M" Y$ c9 X0 a
  4. BEGIN
    7 @/ m/ ]9 V# I# I- w1 e* ^
  5. SET @sp_rtn = @v_ret: H2 z6 \; U* x0 C$ s6 D/ O) B2 g
  6. RETURN9 _5 H4 e2 \6 v. h
  7. END
复制代码
修改为:
2 v7 A& o- N# c* y: H0 H
  1. IF (dbo.NameBlock(@character_name) = 1)
    ' o: W& ~/ S- t" n
  2. BEGIN
    * H$ D4 Q3 \2 N6 c+ C
  3. SET @sp_rtn = -12
    $ w. K2 G1 T$ I2 n1 V
  4. RETURN4 S2 U: ~" `6 E. O, q8 n
  5. END
复制代码

" L" P( j  }( x- k/ m8 ^) @
/ _' N0 r9 A9 z0 X5 B7 \3 D9 a+ h, w0 o/ F/ u

& _8 M- W1 h  U
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-1-2 02:05 , Processed in 0.072816 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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