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

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

[复制链接]

151

主题

322

回帖

5559

积分

管理员

积分
5559
金钱
1760
贡献
3326
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
; i- f5 e# S" N; [6 R5 k4 ^2 D. R$ f
; a. @# o; M$ v$ I- Y
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数) j, ~0 E8 o( D0 O
  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* x& k' y& ^+ O7 ?
  2.     @character_name NVARCHAR(40)
    5 j4 d2 r! `& @2 u
  3. )
    . o  N7 _  B0 u& q7 _/ U! X
  4. RETURNS TINYINT
    " v0 X% ?. e5 Y5 b  x# o
  5. AS+ E# }# t" E. E! _, p4 t0 m
  6. BEGIN: ]3 \  A! i. M+ V9 v2 M7 A
  7.     DECLARE @result TINYINT = 0;, A$ n3 ~6 {# L6 f" J2 _- Z. ]' H, d
  8.     DECLARE @char NVARCHAR(1);* \* z( W3 W! z7 i6 v
  9.     DECLARE @i INT = 1;! t' @# X' h4 s8 T( D2 b3 r1 K
  10.    
    ! d. j! ?5 U  g' M1 |! I
  11.     -- 遍历每个字符,检查是否合法2 D+ N4 n+ X/ l4 I# h* M
  12.     WHILE @i <= LEN(@character_name)
    : f1 b; H5 [8 v
  13.     BEGIN
    % Y" U' ^: k8 I, @
  14.         SET @char = SUBSTRING(@character_name, @i, 1);0 C" Y* j5 Y% D* V
  15.         % Q4 E% X8 ~, V& W" O+ j
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    . V0 o* E+ P* J% z
  17.         IF NOT (. l. r5 v$ J4 T6 f. M- W8 W' R
  18.             -- 中文字符范围 (基本多文种平面)
    % F7 n) K* u% `* r+ V
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    ( b# a. G9 x: h' o0 e
  20.             -- 英文字母和数字
    , R2 b( ^" P# s+ o& s$ x
  21.             @char LIKE '[a-zA-Z0-9]' OR
    ' r) i+ v  }. ]7 \
  22.             -- 允许的特殊符号
    $ H; E- Y* y+ e! q+ U. Z
  23.             @char LIKE '[_ -]'
    7 X) z" t- k. L# o
  24.         )3 H1 T2 c- J$ M( ]$ C8 e  u
  25.         BEGIN
    % l. Y+ s2 D1 ?$ Q$ L' j6 z' O) `; O
  26.             SET @result = 1;
    ( L* N& g0 Y: [4 h* J3 V. ?$ H
  27.             BREAK;
    5 l' [: q6 X8 v7 Y9 r
  28.         END
    0 w' t/ [  t# \; |  L; h1 h
  29.         
    & o3 Y3 W# [% X" \: |! j
  30.         SET @i = @i + 1;$ _& q" S- Q0 b5 R- V6 _9 u
  31.     END;5 i) O% L2 X& F
  32.     7 L# M5 f4 q+ O) c$ y
  33.     -- 检查是否在非法名称列表中/ O+ t* V, J8 Q& K
  34.     IF EXISTS (% Y$ C& |2 M! i* O
  35.         SELECT 1
    0 C+ r5 h* |# {$ `0 T
  36.         FROM dbo.illegal_character_names
    - d& h$ ?9 b" c9 ^$ }
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    9 e. `5 V' X) }' Z, m. q/ _6 y1 E  Q5 R
  38.     )
      s! Z- i5 s) p6 y6 b; r
  39.         SET @result = 1;- K, F1 V( \' l* Q+ D, H1 |, s! o
  40.    
    9 V% |0 f0 j3 D* |! l
  41.     RETURN @result;+ S3 c( n' {( P
  42. END</span>
    # q, [8 ?. F- e2 L: ~# b% d
复制代码
插入屏蔽的字符
4 l  T5 o% M$ T  ~# C& T: F* u+ D
  1. -- 插入非法名称列表(明确列名并使用N前缀)+ \5 G0 i9 u+ Z# i4 H
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    / C# E7 i6 n1 d8 d6 |' G
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    $ i0 s. j" |; K
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    ! f2 S  {' B9 d/ [
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');* ~2 h- H4 _* x: X. I
  6. + Z' v3 v- a: f' }) i# @
  7. -- 示例:查询包含敏感词的角色名
    ( g. L. Q2 z5 E1 v2 x/ M
  8. SELECT *
    - X- j$ {/ |1 T' J# _: I* d6 @
  9. FROM dbo.characters
    # L5 v5 H3 a: U. d5 N( W
  10. WHERE EXISTS (
    - M1 G# f- r. I& M
  11.     SELECT 1
      |) A/ c0 r- w- H
  12.     FROM dbo.illegal_character_names & ]! ?1 [' ]* P( G
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    0 B, j+ O6 \3 E* H% O/ B$ d
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据* U2 H7 O* J* ~: P' y  U5 A: {$ y
原始为:% ]2 B) E4 D9 x6 _2 n3 ?% m# Z
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    ! l/ ]: Y$ M( C  }  K0 }6 s

  2. 4 V* O; r$ q- c9 C
  3. IF @v_ret < 0
    9 V4 x! e2 u5 U# f. F( J
  4. BEGIN; Q6 n7 W* J2 n! @
  5. SET @sp_rtn = @v_ret
    7 L( Y& ~* ^5 U+ ?
  6. RETURN! L7 _- D, m/ a1 k% {7 v4 e
  7. END
复制代码
修改为:/ ]2 G, r/ K+ J0 S7 `
  1. IF (dbo.NameBlock(@character_name) = 1)
    # ?& M5 O% A: L8 y) H, p/ I
  2. BEGIN
    % ]/ r  j" `" V9 P* N) u
  3. SET @sp_rtn = -128 r( v! }9 v9 v+ N+ U( c8 S
  4. RETURN1 t* E) W& a) T" P; ]9 y
  5. END
复制代码
0 y7 a" U0 A; z9 J

& o  D# m" r# n, c9 O# D7 _1 g& K  t
: u' ]8 p: E5 Z' Z) h
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2025-10-31 04:44 , Processed in 0.060216 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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