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

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

[复制链接]

163

主题

402

回帖

7635

积分

管理员

积分
7635
金钱
2228
贡献
4842
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表6 A, V! J# |) R+ v8 A* r

0 y3 n( ~: H4 `- P
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
5 b8 E0 F& x* v% b
  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 (/ q: K" k0 x7 X$ U- ]( P
  2.     @character_name NVARCHAR(40)4 T, v6 k* g- H$ a2 }8 @
  3. )* e/ v3 L: p% J  q6 c) U
  4. RETURNS TINYINT
    * k& V# d2 u0 f0 _7 V4 i
  5. AS
    6 r- @& I3 G, D
  6. BEGIN' ?4 `: h! ~' l0 M* @! b
  7.     DECLARE @result TINYINT = 0;. b! N7 Z0 i7 E8 w# v& `
  8.     DECLARE @char NVARCHAR(1);, l# D( v" Z6 f4 Y
  9.     DECLARE @i INT = 1;
    ; i/ K' S1 ~; Z4 Z. p
  10.    
    * W- l) p! Q6 i& Z; N  p
  11.     -- 遍历每个字符,检查是否合法1 G$ ?7 k% C1 j# ^- `  j
  12.     WHILE @i <= LEN(@character_name)
    6 Z! v& Y; R* K+ @/ w3 e, M
  13.     BEGIN
    . @8 W5 M; y) M7 i5 \
  14.         SET @char = SUBSTRING(@character_name, @i, 1);; f2 i* W9 j# b, C8 }1 z/ @
  15.         
    & R( P+ o0 j8 `$ d
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    & `# q; f- t, W  w
  17.         IF NOT (
    & [& k9 _, W, A' u
  18.             -- 中文字符范围 (基本多文种平面); T6 h" h* F4 l- Q8 x# u5 R
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    ' ]. Q6 {" m4 J3 y" g4 `
  20.             -- 英文字母和数字" I$ p  W7 @2 B/ [( R" r. O" w
  21.             @char LIKE '[a-zA-Z0-9]' OR
    $ y* N) }8 z: O5 L
  22.             -- 允许的特殊符号
    2 t( h' U4 N' V' s- Q* X, \; z
  23.             @char LIKE '[_ -]'
    8 ?, ^7 |/ \8 j8 |2 [
  24.         )
    ; d1 q( }! k0 |$ o& ?
  25.         BEGIN4 n5 U' X+ I; z: K
  26.             SET @result = 1;* E  n6 {" A$ e: o' [& @
  27.             BREAK;
    # i  U, G8 B- V3 M1 T
  28.         END
    $ T6 W# `0 _4 Z6 S
  29.         5 F0 ^- c# l8 ]# ~6 `
  30.         SET @i = @i + 1;$ p( C/ ^- `8 ]* H0 X5 b
  31.     END;
    6 h5 B9 [  ?& o% b) F5 U. K. R
  32.     , }8 l; ~% H. n' Q! v6 j
  33.     -- 检查是否在非法名称列表中8 Y7 X5 W# s& k4 ^, F7 U' R
  34.     IF EXISTS (! v* I$ t- H, N( [
  35.         SELECT 1
    / F8 B4 M8 \$ {# A0 V; T% ]( U
  36.         FROM dbo.illegal_character_names 8 [4 }8 h: }( [! T9 S
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    0 l( ]  E- U$ j4 H5 A
  38.     )/ r$ c" h4 a- g) o, d) K' p# b% `
  39.         SET @result = 1;
    ' l; p/ R* T0 b- k, V2 v3 `6 Q1 ]
  40.     $ U( |) C) O& Z, K  N9 G- [7 R; f
  41.     RETURN @result;8 c# g0 c9 m6 M
  42. END</span>
    ( f/ u- O( S0 r: ?5 v- X( |! T
复制代码
插入屏蔽的字符
0 a3 D- y0 T7 J
  1. -- 插入非法名称列表(明确列名并使用N前缀); q  s! j5 S( u3 c$ v4 d
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');' \3 n$ v6 Q5 y7 a. m. J7 X
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');8 ^7 Z; a/ a3 L0 B
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    / q  P" I) ~" k0 c, r
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');7 o4 d' m) O) M& x& o7 a( j
  6. # U' Z) s% k7 y4 E& _7 P) N
  7. -- 示例:查询包含敏感词的角色名5 D. S" \) d0 q2 j; M
  8. SELECT * 2 B! ?& P1 S' q
  9. FROM dbo.characters
    * L* _- F2 S$ i0 |) [; u- q
  10. WHERE EXISTS (
    / D# y, z8 }( O+ @( X- ?( d
  11.     SELECT 1 : }/ d; v2 W" R3 \6 y3 X, Y0 h
  12.     FROM dbo.illegal_character_names
    * S8 {' I9 g% z$ h9 {
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    6 r+ i( o; s8 x
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据( g2 N8 _$ Q% Z: i7 D* P
原始为:% X7 z# W* F8 n' z0 g- R! s
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    " e  l  I) c, U3 z" v/ a/ }
  2. + m$ S. R+ \8 D" L( A3 X; T3 N9 t
  3. IF @v_ret < 0
    5 y; [# S( f% r" f& X
  4. BEGIN% j' z! E9 T; s; Q* \' Z3 ^
  5. SET @sp_rtn = @v_ret  ~9 N  \- G& D2 h, t* `+ X5 n
  6. RETURN
    ; H+ r6 j  d5 W( c0 }
  7. END
复制代码
修改为:
; Q: i7 Z9 O" a/ z- e" E
  1. IF (dbo.NameBlock(@character_name) = 1)
    9 \  L" T$ y/ [. q& T/ q
  2. BEGIN: x; V- j3 O" @& {* {4 n
  3. SET @sp_rtn = -12
    $ @4 @" \! E1 i  i
  4. RETURN
    + l8 j' [5 F0 o8 ^5 ~
  5. END
复制代码
$ e. Q8 D, M/ J6 h0 i

  i' C; {9 i& l- H$ B$ G: H3 i9 t" z; T
$ P/ N& l) r) y6 u' O: P

) _3 v; k( l+ O' c: h4 b  f
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-6-15 21:34 , Processed in 0.034147 second(s), 29 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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