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

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

[复制链接]

156

主题

354

回帖

6593

积分

管理员

积分
6593
金钱
1912
贡献
4171
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表8 A; f% R6 [% u2 y1 X
. ]1 J5 w, W; u6 e
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数2 X! @! p* b; E  |# c
  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 (2 r2 j3 u: w2 }' Y
  2.     @character_name NVARCHAR(40)
    6 l  x% g3 n3 \; D1 h) ^
  3. )3 T$ D# U) ]# O% `, o( y
  4. RETURNS TINYINT
    6 y! N2 k# z: ]3 y0 M! u
  5. AS
    ' d" ]$ ?# L& ]
  6. BEGIN
    2 ~, ?- u, x7 P  z$ D* m
  7.     DECLARE @result TINYINT = 0;2 b: f7 S, U' f; |# I, \3 g
  8.     DECLARE @char NVARCHAR(1);& C+ Z5 h8 y: U7 n, j  z4 t
  9.     DECLARE @i INT = 1;
    ( e- N. {6 M( g0 l* N
  10.     ) `' d2 W, Y8 h$ l4 N: d
  11.     -- 遍历每个字符,检查是否合法) {3 C. {9 o( s; f* q2 a6 k- f9 X
  12.     WHILE @i <= LEN(@character_name)+ u2 w. F- ~: u6 D9 e% I
  13.     BEGIN
    4 v! X6 F# @! n6 E8 S
  14.         SET @char = SUBSTRING(@character_name, @i, 1);6 `! O3 ^' k  H" ~+ G
  15.         
    3 c, \2 N  j; G) F) M
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号" e3 ?, F; D! q! Q
  17.         IF NOT (6 a! d, ~/ y! m6 f* J8 z
  18.             -- 中文字符范围 (基本多文种平面)
    0 y# Q" n8 h9 @. b# M3 h
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR; b1 S, F; ^) `# T3 o' i
  20.             -- 英文字母和数字
    ! G" K% X0 H& V8 L0 E
  21.             @char LIKE '[a-zA-Z0-9]' OR
    4 K9 h0 L8 v2 G) k# C
  22.             -- 允许的特殊符号
    - ?0 s) l8 z# ?) G7 G8 K
  23.             @char LIKE '[_ -]'
    4 Q" Y$ V7 f2 E& O' N
  24.         ), a  }" R% p2 g! }. c
  25.         BEGIN
    # p; }  t- t, s7 R  d5 F
  26.             SET @result = 1;
    5 X, G$ A6 T7 W- V
  27.             BREAK;
    5 l  B+ K3 D1 }) S1 N7 R# {
  28.         END0 [* a; `& F. R/ C) J
  29.         & R- {, k: y; G" ?* p/ B
  30.         SET @i = @i + 1;6 q: @: s& W5 ]3 A! F- p
  31.     END;
    , v3 g2 O' r2 B3 f4 \# v# f2 F4 w$ O
  32.     6 Z# w6 n3 N/ Q8 A: @6 t1 b
  33.     -- 检查是否在非法名称列表中
    4 w% W5 a, o9 z- U( E0 ]2 C: _
  34.     IF EXISTS (& {! @5 `; B: x4 h* R/ ]  n
  35.         SELECT 1
    - Z4 B! x1 f- }/ H) T6 P
  36.         FROM dbo.illegal_character_names 5 l! O: I; r) T7 `; f3 s
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    * `! c) x4 k! A
  38.     )
    / m, `  C; H& N7 v. ^0 v3 a& P$ Q
  39.         SET @result = 1;
    3 @+ h- k+ L4 E! @
  40.    
    $ p4 x+ s* y5 r) e+ u" O
  41.     RETURN @result;8 x* j/ E& e6 B3 l* n9 U
  42. END</span>/ C6 z8 ~8 j# N
复制代码
插入屏蔽的字符% b) ]' M7 f: `) t# c- ^
  1. -- 插入非法名称列表(明确列名并使用N前缀)* ~# c" B! W! \1 g( H% g- [
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    & I1 E" O+ V$ g3 D
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');3 `# ?# H  c3 R8 D
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');- M' `3 c; P( Z. E* |+ S. [% @
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');& }6 i, \# Y+ z; j
  6. ( o3 ~/ {: V) Q7 L
  7. -- 示例:查询包含敏感词的角色名
    ) @  M4 v# g+ X( t7 W. W( {7 |8 O
  8. SELECT *
    / S5 W/ r" A: N) H
  9. FROM dbo.characters ' I9 U; N* s" v' B# `" K! q1 Z
  10. WHERE EXISTS (
    % [) `7 K: l9 d! q( k
  11.     SELECT 1 % X, h, Q8 B* ]
  12.     FROM dbo.illegal_character_names , S: n* e7 }8 f! i% h: k; ~: ^
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'5 }0 R5 ~; n% G: y# ?$ q
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据, U9 H. v5 j" M1 q4 E
原始为:" W$ a" P' n4 A& D
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    ) j" I. x$ R# q( `) I/ H

  2. / ]" B* t" V6 f1 K2 V4 d. f
  3. IF @v_ret < 0 $ y- o7 x3 |" N& N
  4. BEGIN
    0 `7 [  V, W8 M) H4 h) I
  5. SET @sp_rtn = @v_ret
    $ m( N3 J2 \( f. `7 j4 C- w
  6. RETURN
    1 n/ r) q1 ]4 L! c* A5 c' y3 h9 v# g* x
  7. END
复制代码
修改为:6 \  d5 X+ R; I+ J
  1. IF (dbo.NameBlock(@character_name) = 1)
    - L" ?# q  t* w2 I3 X2 \% s; C
  2. BEGIN
    1 ?4 O9 x/ z2 ]- x$ \
  3. SET @sp_rtn = -12
    5 h$ |4 c$ G2 }; r
  4. RETURN+ G3 U9 T2 b" S! C2 ~$ V& _
  5. END
复制代码

* [# l4 O$ ?& r) K1 C! d; N% ?" p* ?) a+ w( J: k
4 f) r$ _  u# E) ~& K% h
7 s! h/ l- `' Q: x- M
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-1-29 00:25 , Processed in 0.052282 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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