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

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

[复制链接]

155

主题

348

回帖

6179

积分

管理员

积分
6179
金钱
1868
贡献
3808
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
: a+ e% P5 V+ H7 A/ W% H- b0 V- P/ y, S( \
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数: s" j7 k8 E" e+ ]
  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 b+ c2 B# P# J! C5 M
  2.     @character_name NVARCHAR(40)
    6 t; d1 F( h, o+ Y' ?4 L/ S1 w
  3. )
    2 s; @+ y& R( b6 m
  4. RETURNS TINYINT
    % f( {, |+ j1 L- C7 A& r0 S% ~: F% K
  5. AS
    % X7 _0 U4 D+ d1 _5 i$ j1 k
  6. BEGIN
    - }3 y5 C  `1 e/ S4 K
  7.     DECLARE @result TINYINT = 0;) {9 A; j8 l" d# v) m
  8.     DECLARE @char NVARCHAR(1);+ c% E; Q; R2 c1 u7 r
  9.     DECLARE @i INT = 1;
    ) u0 F, g3 h* t8 b2 X5 G) W
  10.     * l' n+ a7 |6 u- a, D& I
  11.     -- 遍历每个字符,检查是否合法
    * ~, ^5 R. v( a- S$ p
  12.     WHILE @i <= LEN(@character_name)
      Z. A" c; X/ L, e' d
  13.     BEGIN0 z( I' X. t/ f
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    9 U; ^. o7 r/ u
  15.         & f6 q: D9 H4 y: @
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号( {7 ?1 D+ }# }6 W' t! I
  17.         IF NOT (
    # s( x  Y* ?. M1 R
  18.             -- 中文字符范围 (基本多文种平面): N& K! R, X# M0 o0 U! g% l
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    ! A' @( L; |& ]. P( f& f, ~$ V9 O0 f
  20.             -- 英文字母和数字
    2 J0 @3 X2 |! S6 D2 N
  21.             @char LIKE '[a-zA-Z0-9]' OR) y! w! W/ n1 m3 k- _
  22.             -- 允许的特殊符号# O9 l! K7 e# O' J: D
  23.             @char LIKE '[_ -]'. o: l; C% L6 b, |( W. r2 V1 }: t
  24.         )
    0 M! D* F1 D& G. A4 k: g# Q( F
  25.         BEGIN6 k" F8 [2 t) v7 f' a# x
  26.             SET @result = 1;: _$ i9 V1 S% h+ Q
  27.             BREAK;
    ) Y) Q" O; o6 R$ j* s
  28.         END
    5 s8 \6 ~9 ]  f4 \/ T  h* t
  29.         
    / V# X+ F2 R. g8 @) w8 Y
  30.         SET @i = @i + 1;
    , ]! T5 }# f. D
  31.     END;, T) ^) i! w1 r. y$ X& n" @) M
  32.     7 n1 r* e8 L8 A1 m; R
  33.     -- 检查是否在非法名称列表中
    ; L9 f8 b) X+ a2 |0 _, q
  34.     IF EXISTS (
    # u( Z* {, _' G, l" \
  35.         SELECT 1
    5 P1 L8 i8 `- j0 B
  36.         FROM dbo.illegal_character_names 8 i' p4 [. p& z# l9 b; [
  37.         WHERE @character_name LIKE '%' + partial_name + '%'" O+ [# l7 [1 g
  38.     )
    * N% a* C& P7 i$ t: A7 `# Y
  39.         SET @result = 1;
      C1 C5 s$ e" B' X
  40.    
    $ l7 S- ~/ v+ g7 Y" j& Y
  41.     RETURN @result;3 l# T3 Y" n  J7 X
  42. END</span>2 K  R/ E: Y' X4 |3 `' m6 [
复制代码
插入屏蔽的字符0 Z# l; b+ x' A! s" I4 y" }
  1. -- 插入非法名称列表(明确列名并使用N前缀)0 l+ G) J5 e1 s' H2 r1 m
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');5 M1 z1 j! L7 d5 S
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');: O/ N( q; o! }) K4 }" e
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');( G; e" A" k0 A7 ~3 k. x
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    # N: o& u- E% I5 R* C+ P. z
  6. 2 m# G% S) S" }1 \0 @$ T' w
  7. -- 示例:查询包含敏感词的角色名
    ' M7 e. g" A' P6 G
  8. SELECT *
    ' ~5 j4 r) j) U& J) {0 M7 T
  9. FROM dbo.characters
    ! H$ E$ r" e" H/ i) D
  10. WHERE EXISTS (" y; p2 z1 Q4 ?
  11.     SELECT 1
    " M4 Y. c& _1 T+ T+ e
  12.     FROM dbo.illegal_character_names
    $ `6 L$ h% C4 v2 d, W
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    ( y- F$ U' F# h% c
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据; v  x: o- A, L  F: L0 d) M9 O
原始为:
9 a* P$ B1 P2 B* _! c
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT# F& p; W. M$ u6 i* [. `

  2. 0 ^7 `, q# ]/ T; j  @: \+ R
  3. IF @v_ret < 0
    6 l; A) C& u. r* _) d7 {0 B
  4. BEGIN
    3 p. u2 u0 a7 G* F
  5. SET @sp_rtn = @v_ret- Y6 C5 {2 b$ \2 I
  6. RETURN
    . ]. ?3 a. U/ t7 w' }, }( I
  7. END
复制代码
修改为:
4 y+ k% k, I5 n' O% u7 t% {
  1. IF (dbo.NameBlock(@character_name) = 1)
    , w7 `- X4 A( A
  2. BEGIN
    & u; g3 `. K) b+ {3 _0 i4 w* C* S
  3. SET @sp_rtn = -121 u$ C7 w! s. y/ U( W6 @
  4. RETURN6 {$ q, C0 \, a, f
  5. END
复制代码

- A$ X- [8 a7 A% t
/ Y4 J9 x2 Z6 |4 }- u3 ^7 t# j9 U; p2 o7 @

0 _9 j) {& ]- A! o. R* D( e
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-1-1 15:07 , Processed in 0.241248 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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