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

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

[复制链接]

157

主题

362

回帖

6843

积分

管理员

积分
6843
金钱
1944
贡献
4380
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表- [# t: I+ D) ]# g9 x3 d

! |4 [+ p- J" q* Y1 H- y$ `0 |6 {, ]
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数1 K! E" k: b8 v% `1 `6 G6 z
  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 (: O$ _5 w/ E  @' C- ]
  2.     @character_name NVARCHAR(40)
    0 c% M! ^( R3 m, o& S+ f( W5 t
  3. )
    2 U: T! c; S. Q* ~6 D, ]
  4. RETURNS TINYINT9 v4 ?2 i4 U$ [9 u" |
  5. AS& m  J  r/ Y' l" T+ {! L
  6. BEGIN
    ' S' q0 A  @" ?# {" j
  7.     DECLARE @result TINYINT = 0;
    ) x8 P; h/ W3 A" `, r! H" N/ u
  8.     DECLARE @char NVARCHAR(1);
    * j/ W! k" m" f/ v
  9.     DECLARE @i INT = 1;( g  B# |' N5 {6 p4 I6 d, S  T
  10.    
    " u% H: T- o( Q$ M/ |" I
  11.     -- 遍历每个字符,检查是否合法- D: K1 w7 Z* q  G4 P; I2 d2 `/ Q% J
  12.     WHILE @i <= LEN(@character_name)
    ; s$ W5 J  `( U
  13.     BEGIN! G! K/ i% c7 W- Q& T& `6 h# D
  14.         SET @char = SUBSTRING(@character_name, @i, 1);, \2 t# o8 Z2 {5 m8 H' X4 n
  15.         
    9 V8 P. n/ ^) B) v: ?5 Q! ?. h
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    # g& X! r3 b& w5 I9 W- K
  17.         IF NOT (+ n& V. D2 x" B9 T
  18.             -- 中文字符范围 (基本多文种平面)4 D/ |* E" d4 t/ v2 F$ e- D5 Y
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    # z  m: Q" Z# t% l2 T
  20.             -- 英文字母和数字4 J: \3 g  n! w) s, M: K8 }
  21.             @char LIKE '[a-zA-Z0-9]' OR
    " \  I) R$ K: _* f
  22.             -- 允许的特殊符号
    & N2 m0 _* N/ `" Z
  23.             @char LIKE '[_ -]', u- z. g# g! d5 y- i5 `% e; j
  24.         )
    0 s' C) X' f% x7 s% ]
  25.         BEGIN  {. J1 A6 j' q/ T* J; x
  26.             SET @result = 1;
      n! p- `) R. l" W0 s1 b
  27.             BREAK;
    9 G) q" b' D& t4 f
  28.         END. A, P5 g. j8 J2 X* l9 E& }  X( Q( ^
  29.         
    % G3 ^$ q2 v0 j, \% A- i, Q
  30.         SET @i = @i + 1;
    9 V" o; L+ W9 G% {7 C# H
  31.     END;
    1 ]4 O, s; d8 I( ^
  32.     5 L& ^4 N7 k1 z' g) L# A
  33.     -- 检查是否在非法名称列表中8 |6 ~. a$ C& N7 v  z
  34.     IF EXISTS (
      ]% s' [. B1 b7 X4 G) O+ a
  35.         SELECT 1 7 y# v( u; ^! o) o
  36.         FROM dbo.illegal_character_names & ^& I4 [) m3 {" h+ F% ]
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    7 p! i0 Z) l( ~! T, Y3 B1 O1 ]
  38.     )
    0 ~. i  o4 Q9 I% T
  39.         SET @result = 1;3 ?" |, e  w/ k# Q. ?; G( T
  40.    
    : a/ @7 g  t# L3 m
  41.     RETURN @result;2 T$ _# d$ j5 A5 ~
  42. END</span>
    9 {  x) ^. \) W  M3 Q& e
复制代码
插入屏蔽的字符' f' k1 r; Y% P# }
  1. -- 插入非法名称列表(明确列名并使用N前缀)( g: z% L) Y, {$ g
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');& c: n0 Y! N6 u8 T; y5 X9 `/ d
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');. d; Z/ X( K3 `; K+ b8 L
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    ! B9 P) ~0 o! l% J6 S- R" k
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');6 D5 h- D9 z8 w( |4 W1 s
  6. $ _2 r4 _. |. m& X$ z" K! N
  7. -- 示例:查询包含敏感词的角色名
    & A! n6 T& ^9 v! m9 ?. n
  8. SELECT *
    / {) E# U# ]' f
  9. FROM dbo.characters
    : A' f# l& H4 @( V; M+ |
  10. WHERE EXISTS (6 z+ l- z* G5 y2 T' m9 `# R
  11.     SELECT 1
    & ]' E; X5 O! I
  12.     FROM dbo.illegal_character_names 2 |) @4 ^; x4 Q; J( y3 g. y( A
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    " T# @7 x; y( o9 U5 J4 D
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据1 \1 _/ o* b; i& B8 o7 o2 Q( F
原始为:
& z/ E6 X1 `  n, n& M8 Q5 P
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT7 B, c+ b/ W+ [2 Y2 A0 O" O

  2. # H' j5 _, k" P2 }
  3. IF @v_ret < 0 - v9 w- V$ m1 {' N, K4 n
  4. BEGIN' D( G- ]' |$ D% V9 \+ m
  5. SET @sp_rtn = @v_ret
    5 ^. m1 f( F/ ]4 Z( v7 E
  6. RETURN
    " @3 _6 O* Q2 A; u
  7. END
复制代码
修改为:
) e6 T; x8 M( l8 w4 n7 B) B, s
  1. IF (dbo.NameBlock(@character_name) = 1)
    5 q* e$ ~' n' ~7 _/ i
  2. BEGIN
    $ Z; n2 k8 ^; O0 _
  3. SET @sp_rtn = -12
    # x  F" C' j% ^0 q; j+ j
  4. RETURN
    5 e# r: y( \0 S! g/ }+ l
  5. END
复制代码

+ ?' @8 d5 R$ t# a* D* H& ]( a- f( B3 }0 {2 F
, H& Q  `" i" {7 O' `
5 a7 \/ e/ V% p6 T- a
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-2-16 11:01 , Processed in 0.054613 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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