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

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

[复制链接]

152

主题

325

回帖

5593

积分

管理员

积分
5593
金钱
1773
贡献
3343
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表& S/ l2 J6 R7 d# |1 \$ Z1 S8 o4 R

. y% Q5 `2 V9 ]1 U# ^
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
% _) v9 n. Z3 @
  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$ J- E8 N4 w9 T( }' N8 c* E
  2.     @character_name NVARCHAR(40)5 g3 U4 ~- {3 |- X% X
  3. )
    ; k3 K7 r8 [5 a, }/ F5 w  V3 p1 C
  4. RETURNS TINYINT  g- p% t1 S" A) K5 a$ A
  5. AS: }6 g( C5 Y' M7 d+ ^8 s
  6. BEGIN
    / ^  O2 H9 K9 n, ?' |
  7.     DECLARE @result TINYINT = 0;
    9 p9 y3 Q$ [9 i/ G
  8.     DECLARE @char NVARCHAR(1);
    & T7 c3 o8 V9 v* i, z- N# r
  9.     DECLARE @i INT = 1;9 I; h- V, ~9 [3 r# J
  10.     ! I1 i0 {( t2 ~% u4 R
  11.     -- 遍历每个字符,检查是否合法
    7 s: H) N6 [# `7 d: I
  12.     WHILE @i <= LEN(@character_name)
    & P+ j# H: r, E# V# w+ D" l. m
  13.     BEGIN
    % C) `( p6 J5 K6 g
  14.         SET @char = SUBSTRING(@character_name, @i, 1);; @* X& I" l$ Q/ _1 e
  15.         
    . ?! F1 q' `+ X  Y0 F9 \
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号4 q8 B- }, i1 Q( j- O7 p
  17.         IF NOT (
    2 O6 e! G4 d% |2 G4 p5 d
  18.             -- 中文字符范围 (基本多文种平面)
      h' S) a3 Z& T/ u
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR/ G  _- s: B6 ^& Q: t( s
  20.             -- 英文字母和数字; K" f6 Q! O8 U6 o1 ]
  21.             @char LIKE '[a-zA-Z0-9]' OR
    4 z+ P4 A' N) t. `8 S1 _
  22.             -- 允许的特殊符号
    : F& W- R* S" O
  23.             @char LIKE '[_ -]', d5 V$ I# O  Q& J( V3 S* Y. l
  24.         )
    / C" r5 B. E. G* w& C) _/ t
  25.         BEGIN9 ^/ E2 A# ~$ u/ O
  26.             SET @result = 1;0 N3 {) O6 W& I  O
  27.             BREAK;
    : [6 M. @, h9 g) U- m
  28.         END
    + U+ Y$ x- U- d( D
  29.         % [& B+ a% M% X) e  S2 g
  30.         SET @i = @i + 1;
    % d) C( N5 I  _0 }
  31.     END;
    1 j2 Y  a. b7 u) H+ ?! O
  32.     1 j* \' h) D. E9 T
  33.     -- 检查是否在非法名称列表中" T# T0 Z+ k6 N, B5 Q2 I2 j& `
  34.     IF EXISTS (
    " I# s) h& B- X! `* W6 g1 C% P
  35.         SELECT 1 ( G# z$ i) `5 [5 b; k  }
  36.         FROM dbo.illegal_character_names
    : u! f( S! Q# \( z& Q
  37.         WHERE @character_name LIKE '%' + partial_name + '%'5 f9 J+ J% n) P' R. k
  38.     )" X1 G0 s  m. P9 y( a
  39.         SET @result = 1;
    : h) F8 K' T! p% H
  40.     1 r, m* b: f/ V9 ~1 u
  41.     RETURN @result;) f, R. e  e* q4 ^1 `1 W; B& P
  42. END</span>
    + I' @6 @( M3 F% F" o) t
复制代码
插入屏蔽的字符/ {2 U( i% n% n& j
  1. -- 插入非法名称列表(明确列名并使用N前缀)8 [: n2 G+ l+ ]6 N
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    ' k: C# H! B8 s7 L% c7 c
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');0 f  P0 M, E; C' f! r
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');, {/ H( ], `! S, N
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');" o* e9 s/ K2 K1 T

  6. 3 X3 a/ K7 m% L" W
  7. -- 示例:查询包含敏感词的角色名% `$ ]: a6 Z! `9 \+ T" P1 G! U2 m1 G
  8. SELECT *
    ) C% ]% O! p  O7 j, U/ |
  9. FROM dbo.characters
    2 u  V6 p# P2 o1 M, R
  10. WHERE EXISTS (
    8 k9 r0 v$ K% j& d' C* W! J' y( _% v& D
  11.     SELECT 1 7 H1 y. k4 e7 R$ @
  12.     FROM dbo.illegal_character_names
    3 v2 }) Y. {+ n" v! ?( k* x* ~
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    # o7 C7 f7 A4 v6 l0 Y
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据; o! V" m; e4 A* _+ N7 A. g0 O
原始为:/ e# U1 t  D% m3 r' x
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    5 j5 q9 S% a. g5 n# v
  2. 0 J3 h" R- {  K6 k
  3. IF @v_ret < 0
    * ]) M) Y: t8 d5 \  Q3 |* ~
  4. BEGIN* M& V$ k6 `9 g& A
  5. SET @sp_rtn = @v_ret; l4 |4 S- Z. E* y( c0 x
  6. RETURN
    0 l- t1 O4 X& @. ?. }) J8 l0 E
  7. END
复制代码
修改为:
2 R; x: \9 \7 T% D& |4 `
  1. IF (dbo.NameBlock(@character_name) = 1)6 B- s1 t% t1 X
  2. BEGIN
    1 K4 A  V2 u+ M8 j( {
  3. SET @sp_rtn = -129 u( @$ p* J; I2 @
  4. RETURN
    & u. s) a8 e1 b" [6 u( f
  5. END
复制代码

# l( B+ A1 q9 B3 F! T, b1 \' X
$ p. `& K0 n/ A+ p8 J8 C* P3 q% v( e9 h- B; `6 n: A: ]( n

8 V# T1 b+ O( U, C3 Z  Q" s5 a
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2025-11-8 23:26 , Processed in 0.060680 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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