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

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

[复制链接]

155

主题

352

回帖

6236

积分

管理员

积分
6236
金钱
1880
贡献
3849
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
- C% H2 c, D% c$ c$ P7 a0 }. h
4 B' m% K3 Q/ A% Z/ i
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数+ q2 d6 x3 _. D3 I
  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 (' j( v' M9 b3 G
  2.     @character_name NVARCHAR(40)% C5 M) }) Y& b5 P. q/ G
  3. )- H1 B2 V) ?; ?3 w% d
  4. RETURNS TINYINT
    6 @" u2 p, c8 ~) c7 {
  5. AS9 ]1 ]: n3 i. l$ X
  6. BEGIN
    3 k; G: X% u  [  o) Q1 E* b% \
  7.     DECLARE @result TINYINT = 0;  w% |/ i0 E! h+ O4 ^( A
  8.     DECLARE @char NVARCHAR(1);
    , c9 ?8 x% z- t3 q
  9.     DECLARE @i INT = 1;% s) i/ [% X, v7 u$ l$ C
  10.    
    ! Q9 M3 A1 Y- @! e+ |
  11.     -- 遍历每个字符,检查是否合法0 b. ~, e* _6 @7 u9 Z! T8 b
  12.     WHILE @i <= LEN(@character_name)& [  c& g4 U1 m( i
  13.     BEGIN  U1 s0 u: C1 D+ \  b
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    2 y" I. x/ D8 v
  15.         
    ! c" ?' P4 Y+ S+ s
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号) Q: A2 k5 A8 ?
  17.         IF NOT (6 w! P  S# q' n) V% Q& V$ l7 f
  18.             -- 中文字符范围 (基本多文种平面)
    + _  K0 y' |4 M+ {6 ^
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    5 f. i% W$ ]7 d
  20.             -- 英文字母和数字" O: X( K, w4 s+ w% K4 U  {
  21.             @char LIKE '[a-zA-Z0-9]' OR/ T5 m; A* h/ N
  22.             -- 允许的特殊符号
    / ~6 `+ {! I/ {- M3 _
  23.             @char LIKE '[_ -]'
    ! \6 @( W4 P! x- d3 ~  k7 j/ `
  24.         )
    0 D5 a1 ~# l9 P1 p0 t; A
  25.         BEGIN3 d* n2 c5 I2 y- f1 g! p& x
  26.             SET @result = 1;( a7 T9 q  t7 H- v6 t6 ^( p
  27.             BREAK;
    " p. [/ A  [# j7 J  `
  28.         END) ]$ z3 W3 f; x( `
  29.         & d% r: W3 g0 X9 W+ n$ Z, Q8 ?" q
  30.         SET @i = @i + 1;
    8 o) G1 x4 ]! @  t- y
  31.     END;
    7 C! |$ g* l! I2 \  o, j4 i8 ^
  32.     & `7 B' j4 |1 O1 [- ?/ c: z1 |
  33.     -- 检查是否在非法名称列表中5 x  o6 }" G+ R" F$ \% _6 Z3 d
  34.     IF EXISTS (
    " [- b- q. r( p* Z0 R& |7 e
  35.         SELECT 1 - i& Q6 P1 \9 w- _/ |, M+ h
  36.         FROM dbo.illegal_character_names , v, [4 L/ P0 p' x3 |7 ~) O- U
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    9 R# x. q- k- D+ e# }) a8 ]
  38.     )
    & K9 V- o" {( b; E1 L% ~! D
  39.         SET @result = 1;
    " ^7 h# \8 p: x) ?3 n3 z
  40.    
    ( u4 [: X% x: y) |4 u
  41.     RETURN @result;; W/ [4 h2 }# r9 y1 N5 g3 {1 i
  42. END</span>8 U8 |5 r# _+ N( F. M' u5 F
复制代码
插入屏蔽的字符
$ l/ ~" I# H; u: X7 R4 x8 i1 Z
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    - K* `( S. W! w, A
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');3 }- L% h. l' N- D, e# o
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');. a" W% ^$ `; `: `! n& A4 J' ]
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');' a# c# A7 l3 t1 f
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    + U# p% N- Z  T9 ?

  6. 4 U# k" U  ^4 {, P& r' m  ]" \$ a
  7. -- 示例:查询包含敏感词的角色名
    ! H) Z5 n9 [2 r7 }
  8. SELECT * ( a7 x, z2 Y# e: n$ h$ s% W5 V( X
  9. FROM dbo.characters 5 _# U1 _0 ]4 V
  10. WHERE EXISTS (
    , ?' @1 Q' K6 M5 {
  11.     SELECT 1 9 J$ V. b9 Q, Z, m2 C
  12.     FROM dbo.illegal_character_names & S1 C" @+ p- W
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    4 ~* n6 j+ Q* l' c* c" e2 S
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据. Q" H) E# x9 e; W2 R( B+ `2 r; e
原始为:
1 f7 }/ a  m9 w: k
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT* e9 Y8 m, ^$ z$ A# w" [

  2. . q9 s' n( a" b) u: e- j: b, e
  3. IF @v_ret < 0
    9 x5 q  Q. Q, ]7 A$ K% n! M1 Z
  4. BEGIN
    # c7 y$ P# K' x) t& @' M. o
  5. SET @sp_rtn = @v_ret  {! m1 f" K6 e: x- z
  6. RETURN; P. B$ n! W% w. h/ r9 L' r( M/ T
  7. END
复制代码
修改为:1 `( g" ]3 _2 g5 _# l
  1. IF (dbo.NameBlock(@character_name) = 1)
    7 b$ s  @; _, S
  2. BEGIN# d! |. t& e  i( H1 s
  3. SET @sp_rtn = -12
    % H& d- z% c" S& g3 z2 K) w) B* W
  4. RETURN; z7 a, S7 w; S; P3 y) C- q; ]4 H
  5. END
复制代码

. U5 d2 t. H9 M$ x  B6 X; ^$ _1 |# V: M' B+ F
4 {# @$ ^! m2 I  ]9 ~$ @& ~

' G  S- j& G  w% @- b. q
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

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

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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