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

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

[复制链接]

157

主题

362

回帖

6843

积分

管理员

积分
6843
金钱
1944
贡献
4380
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表2 s- C, X! {& m/ T+ S
* y5 T# ?5 R) k; A9 F
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
1 A: ?5 d* F' \; |# T& l
  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 (
    , n' k; K$ K) g6 z  O0 P: Z# e! s
  2.     @character_name NVARCHAR(40)1 r5 M; y' i' Q; M) |
  3. )
    - _) V/ m/ U! h7 X
  4. RETURNS TINYINT1 v$ [8 I: ]+ o3 p5 P
  5. AS
    - F0 i+ n, P( X
  6. BEGIN
    + ^1 Z) [" s9 Y2 m1 T
  7.     DECLARE @result TINYINT = 0;
    ; _" z" C- y+ J7 G5 y
  8.     DECLARE @char NVARCHAR(1);
    3 M8 _, a3 ?4 z" B
  9.     DECLARE @i INT = 1;
    * O. c* C. b: @2 x) w- u5 s
  10.    
    6 r+ G0 `2 y" H0 [
  11.     -- 遍历每个字符,检查是否合法
    . _' K3 D$ _1 R5 t. S0 U1 {, \7 k" }! g& }
  12.     WHILE @i <= LEN(@character_name)/ N( C" @! m5 d! F% Y+ H
  13.     BEGIN4 n7 g; L" ]# T, P
  14.         SET @char = SUBSTRING(@character_name, @i, 1);# ]- Z/ ]4 v  P. o5 f0 u; i
  15.         & j/ ~/ G3 M4 @+ M) w
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    , i1 `- I# ]5 ?4 T, \
  17.         IF NOT (
    , H2 T3 B* Q9 b! `/ D1 r
  18.             -- 中文字符范围 (基本多文种平面)9 s& H5 t) |# T, V8 N
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    $ W1 a/ O( X- g' I% f9 e
  20.             -- 英文字母和数字# h! q/ D- J" j% b& u
  21.             @char LIKE '[a-zA-Z0-9]' OR
    4 p& o! l& D% h5 d
  22.             -- 允许的特殊符号0 @5 w: b' t* ~8 a9 z/ w
  23.             @char LIKE '[_ -]'. {* k3 R* R% v
  24.         )
      k, x3 W5 Y' w
  25.         BEGIN; K" i& r: d( P; _# p  p
  26.             SET @result = 1;$ i0 m: c/ G) B2 Z7 }
  27.             BREAK;) S$ H5 j) b. w6 y, w" y
  28.         END9 G2 l* Y+ r- i! Q# ~! \
  29.         
    7 E9 w+ x4 a$ e4 w# i9 c
  30.         SET @i = @i + 1;
    # ^4 E" ?% D5 C6 H
  31.     END;4 a4 I0 F1 N1 C3 I0 T+ z
  32.    
    9 O8 f6 }9 \) n7 X1 ^2 k# i8 {% F
  33.     -- 检查是否在非法名称列表中
    2 i: {+ N& E; q" A. `# r& u# z
  34.     IF EXISTS (
    ' `8 w1 I, i# n
  35.         SELECT 1
    0 H" \5 i( O+ e: ]  a# m3 U( p
  36.         FROM dbo.illegal_character_names
    $ ~' U) G6 n9 E. y, E! {0 ^+ W
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    - d2 L0 f4 Q' i( a
  38.     )
    0 q5 u; R3 }. l+ G
  39.         SET @result = 1;
    5 N8 B& X8 p* }4 k7 b
  40.    
    ) A  j% i$ U* j! C$ A
  41.     RETURN @result;9 X/ D  {$ X) W
  42. END</span>
    & i# S( Y, e3 s; S" I! z3 }  D$ d4 o
复制代码
插入屏蔽的字符7 p( k5 A3 C- b0 n3 F# M5 i' ]1 b; Z
  1. -- 插入非法名称列表(明确列名并使用N前缀). c3 e# ?" E! H
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    3 d* \" B- X5 @& w7 N
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
      b' _% V9 t8 m+ ?/ k
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    & x& j; C3 ^( \9 n
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');: Y& ]+ [6 l2 s1 F0 W1 w+ X
  6. % h$ ?% g& s& f( m, Z
  7. -- 示例:查询包含敏感词的角色名9 W6 C( V) X1 v; z$ g) n# N
  8. SELECT *
    , E9 S' Q; Y6 B( O& ^6 a0 D  s; A& a
  9. FROM dbo.characters . V* i/ [7 t7 Z* D3 \
  10. WHERE EXISTS (2 l( G0 r$ x1 {
  11.     SELECT 1
      _" P5 T2 z5 H
  12.     FROM dbo.illegal_character_names
    : E9 x* b5 f6 J5 G* \
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'2 M* v$ h; V1 X9 \+ S
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
5 F; M6 y* t! \4 A$ ?9 z8 e" L原始为:$ X, U5 D" N; o# k+ G# B
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    - a) ~; }+ n: a, ~( Y
  2. 3 Q( g: S0 T  C$ D
  3. IF @v_ret < 0
    + L- y, u/ T  y. P4 m
  4. BEGIN
    5 A: }, {9 v/ i+ r2 a, d, Q
  5. SET @sp_rtn = @v_ret) r% w( M0 g, |& T+ W
  6. RETURN3 H0 }  f! R( U# |
  7. END
复制代码
修改为:( d1 s) \1 n* h  e
  1. IF (dbo.NameBlock(@character_name) = 1)
    + e8 h* x3 _/ W
  2. BEGIN) c8 P) m) g/ Y- W# u( x7 l
  3. SET @sp_rtn = -12
    / l8 S; ?3 G) x- L; e
  4. RETURN
      v, b; f) h! a# @# B2 s
  5. END
复制代码

- E' E3 {2 ^& E7 E+ H% z  u& b" S) d; u( }/ }+ P' ?+ ?( `* d0 b

" l' Q, l; R. M. x" V
3 E; z9 Q/ h/ L# y6 i/ A  m$ x. }
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-2-16 13:10 , Processed in 0.045569 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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