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

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

[复制链接]

157

主题

371

回帖

7181

积分

管理员

积分
7181
金钱
2067
贡献
4586
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
' l2 c" K* H4 t3 [; h3 m8 T% W1 v. y+ o# a& Q
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
  c9 C. A+ b& N1 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 (* P2 g$ Y! U& I  [
  2.     @character_name NVARCHAR(40)
      k4 r8 }# z2 K) b: V. `; I
  3. )- J: e, i) g/ E0 t; I
  4. RETURNS TINYINT% _; A8 i, J8 o  _' j! a
  5. AS
    , ^6 ?% Q& Z# k- d' C) ^5 @3 H" F
  6. BEGIN0 o$ W) j5 P# w+ ]) l
  7.     DECLARE @result TINYINT = 0;
    9 V+ ~" q& M2 L0 E' o* j$ I2 S
  8.     DECLARE @char NVARCHAR(1);$ t: \: @2 \5 H; M, K: \
  9.     DECLARE @i INT = 1;
    3 \# F4 N* ]6 L' ?# ]
  10.    
    . h# k4 a0 u/ k
  11.     -- 遍历每个字符,检查是否合法& H: @9 o( @- k2 l5 x; ^
  12.     WHILE @i <= LEN(@character_name)
    4 L5 h! F, I( P% M$ ]. l- T
  13.     BEGIN
    , n/ U$ |+ L0 W
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    ) s7 D) {4 U+ x
  15.         / k/ L3 {6 g7 N2 V
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    4 \0 D- B. @5 Z/ X5 `" \! j$ t3 k
  17.         IF NOT (
    0 i# x0 b$ P0 s9 E2 f4 z: V
  18.             -- 中文字符范围 (基本多文种平面)
    ' E& m6 r( K, M, o, `1 o
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR6 B& N* [/ i) a& J" {
  20.             -- 英文字母和数字6 E2 f+ G- h) K/ _9 a% H
  21.             @char LIKE '[a-zA-Z0-9]' OR
    * a( y% |2 A  E5 i( z
  22.             -- 允许的特殊符号
    / }8 c' [$ F% d% ?
  23.             @char LIKE '[_ -]'
    , G6 m+ V! p% A+ x& M; O
  24.         )1 X  N! g  c# ?1 ]8 r/ r) q9 d
  25.         BEGIN/ w8 ~/ O5 p8 P6 F0 J( ^
  26.             SET @result = 1;$ f! v( ]7 E! o3 [+ S. S3 M
  27.             BREAK;
    5 x& i3 j8 t- [1 i
  28.         END
    ; ]+ Z; s6 L! J# r
  29.         2 w; f4 a, g7 g3 z* p
  30.         SET @i = @i + 1;
    7 x! \9 p( s" `2 M9 C8 a9 k5 r
  31.     END;' A* k3 a: |* H4 p- M, e6 n
  32.     ) C4 O3 d- y( B
  33.     -- 检查是否在非法名称列表中# [5 h1 V! d0 P% M" h1 J0 Y9 s
  34.     IF EXISTS (# ?, W3 F) o% H4 F/ E* N) q  B
  35.         SELECT 1 ! Z+ r( _9 W) }6 {$ B; q; Y% k
  36.         FROM dbo.illegal_character_names
    ) f! j6 W9 L; W6 D6 ]7 c
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    9 A. S+ d* u! `+ ^) V% v. N. c
  38.     )
    + `" P8 r# f. M5 Z, P% @2 B( c
  39.         SET @result = 1;: P: ^. G9 E# `8 R+ v1 T
  40.     ; e2 D7 l# _. Z" r. D) h5 `6 J* g
  41.     RETURN @result;
    - C* o  j% `7 }9 |& ^
  42. END</span>
    - c) s1 Q  V$ P6 ~' G
复制代码
插入屏蔽的字符6 n; v* Z  q/ }4 w4 z
  1. -- 插入非法名称列表(明确列名并使用N前缀): \8 i% G; @" f! \4 O6 Q& z/ z$ r
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    & _5 R( c; R, F1 L+ q( B
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    : }* }- T/ A# Q6 W& F
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');0 N3 y3 a: C; ]% _- i
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
      s" @/ Z# O. m4 {

  6. * V/ L! u" o' v* S2 u
  7. -- 示例:查询包含敏感词的角色名$ S: v# x- _4 G# T$ o6 [& @
  8. SELECT *
    ( W: ]* d1 i% X2 ]
  9. FROM dbo.characters ! p& v, O- m! c4 W; p. Y
  10. WHERE EXISTS (
    9 m) Q/ `( s& w2 U/ h) Q
  11.     SELECT 1 . s" Z) N/ O* w  G" X0 V
  12.     FROM dbo.illegal_character_names   x0 p9 H5 z# c( `
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'  U% V0 O( x/ T. S; l
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
9 g+ _7 g; Q, Z) d原始为:
  m+ X& ~* n7 q& B1 v  H! Z+ Z
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT: g4 V: H* X+ F+ U4 F
  2.   @: B* d' s( H
  3. IF @v_ret < 0
    $ g' W" x  n6 a( q3 s3 s* P1 A+ n' s% @
  4. BEGIN
    ( K( I+ W/ z2 N
  5. SET @sp_rtn = @v_ret6 ?0 j$ f, Y* R" h8 a# H9 e
  6. RETURN
    6 s- M4 w/ k7 Z; v
  7. END
复制代码
修改为:8 e9 s$ C7 J' m6 G
  1. IF (dbo.NameBlock(@character_name) = 1)+ F' B0 L5 m' j& m: y! d; t) ~
  2. BEGIN
    " y3 Z! f! d( F1 P+ g. U
  3. SET @sp_rtn = -12
    : A/ W" M; j) e
  4. RETURN
    0 ]! u0 F' P4 ~
  5. END
复制代码

% Y: u# H! d8 C# q5 G3 @8 c5 k" N# E# s( `6 t

; Y* p$ d  e1 V- f- P
. L( f4 e9 P% ^$ u5 W
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-4-10 06:49 , Processed in 0.040895 second(s), 28 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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