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

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

[复制链接]

155

主题

352

回帖

6236

积分

管理员

积分
6236
金钱
1880
贡献
3849
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表+ h+ S  M5 m/ X' h) W4 m

* N6 L, c9 z  t+ r% v
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数6 y0 t9 S& M9 U. v8 x0 j
  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 (% C$ S7 z" m# B% z2 b
  2.     @character_name NVARCHAR(40)$ O' k  Z! ~+ _. i: G9 d2 g+ T2 i
  3. )5 _% V# I' Q/ [* o7 l. w1 y, }
  4. RETURNS TINYINT
    ( z, [7 p1 G9 F( w# l6 y0 o
  5. AS
    " g) e+ h. M: |. B
  6. BEGIN% M2 w  [  I* G2 i
  7.     DECLARE @result TINYINT = 0;
    - q) G* k4 r, K. g: g8 ]' }
  8.     DECLARE @char NVARCHAR(1);
    ) g6 J1 R) F% F( X, L
  9.     DECLARE @i INT = 1;# D+ l! V, n$ O, B1 r+ `3 B
  10.     9 d/ F- w0 j. C6 H4 N4 i
  11.     -- 遍历每个字符,检查是否合法
    $ S2 p: P: Q$ C, h$ O/ C
  12.     WHILE @i <= LEN(@character_name). E+ ^4 \4 A2 }5 F6 G
  13.     BEGIN  Y& {( z1 [# ~+ j
  14.         SET @char = SUBSTRING(@character_name, @i, 1);0 W' z# Z$ j+ @. N
  15.         
    4 j% P7 S! K3 m( G0 F/ }& h% G4 _
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    5 l( K/ q3 W* E1 J' @7 X
  17.         IF NOT (
    " ]7 S' ?6 D2 v
  18.             -- 中文字符范围 (基本多文种平面)
    4 ^* j$ m! {" G) c! m% i
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR- j* u. T3 B: X7 {$ B6 @  d: l
  20.             -- 英文字母和数字
    % F1 G* t9 r. g# [* B
  21.             @char LIKE '[a-zA-Z0-9]' OR9 N9 V3 T) I2 t" v4 j$ _
  22.             -- 允许的特殊符号, Y' G: v1 g* G' E1 V' [2 M7 f
  23.             @char LIKE '[_ -]'9 @$ e' k2 T: I9 c2 V
  24.         )
    ! z2 a, ~4 R5 p$ f
  25.         BEGIN+ w0 s6 u& R8 j8 w' v$ P7 c
  26.             SET @result = 1;
    ) S; E8 @' |, C& h4 l
  27.             BREAK;; h# Q" }# C' q% j7 r. A/ A- \
  28.         END; l: @/ I7 r, q2 H2 r# K
  29.         7 x* |3 G' v0 o: y' k& V9 `  O
  30.         SET @i = @i + 1;
    3 h- g5 ^& J: j7 u7 h
  31.     END;. P& T8 F. C6 ~
  32.     4 O- @. ]0 m0 C* T! W0 Z
  33.     -- 检查是否在非法名称列表中
    7 Y/ V, _) L! ~/ _7 r& t
  34.     IF EXISTS (% E. `* H2 N, ?( q) G$ ^8 K
  35.         SELECT 1 ' n; V5 ?( P% e$ i
  36.         FROM dbo.illegal_character_names 4 c) c* E3 P4 y6 _
  37.         WHERE @character_name LIKE '%' + partial_name + '%'; E4 ^" ^# v: K7 j/ L+ {/ n
  38.     )+ o5 ^- M! f9 J1 p7 U4 e5 {  A8 B
  39.         SET @result = 1;
    2 y- `& w- j0 ^6 ]: P2 M  d
  40.    
    ' `- @/ q7 O7 F5 M
  41.     RETURN @result;9 X( }7 O# M) E6 D! P
  42. END</span>5 G6 ?( @6 W) J) x' F/ ]3 Y8 |
复制代码
插入屏蔽的字符
4 H/ k7 _7 v& p4 g: [
  1. -- 插入非法名称列表(明确列名并使用N前缀)- o  H8 V4 W1 @- C
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    ! F% X  y7 ?/ U. h
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    ! @" v: {& G0 }$ e) |& v& [0 E
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    - z0 G  V9 a& T
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');& E2 V! A: \2 {
  6.   @; `4 q: V% n7 k  s$ N% Q
  7. -- 示例:查询包含敏感词的角色名
    7 B& f" L+ x! F, |4 J, c. ~
  8. SELECT * 1 d7 ~. _  u( F$ {9 O5 ?
  9. FROM dbo.characters
    . R2 i( K, A) }, b& g( ~
  10. WHERE EXISTS (# G7 q) q) S' C; H- p( M  J
  11.     SELECT 1 / R# q* {. P; w) a
  12.     FROM dbo.illegal_character_names # l8 J( T( X3 O$ y* e/ d' D
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    - M$ H! @& P5 c. p4 E: T, ~) z9 {8 b
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据" L3 H5 U) z9 W% q) o$ d2 ?! Z
原始为:
( |) d- E' s+ ?
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    : L+ w$ g' T( D0 Z
  2.   D8 v% t; ~4 J; ~, L7 g
  3. IF @v_ret < 0
    8 Q$ s" n) F) Q
  4. BEGIN
    * a' a$ l+ d4 V8 v8 m7 g( _0 [+ v) U
  5. SET @sp_rtn = @v_ret
    ) i3 f9 Z% B" t. U
  6. RETURN
    5 {( d' y( A% Z7 Y, ?" U  W; w
  7. END
复制代码
修改为:
& F0 L. i( x: t$ d8 {. [
  1. IF (dbo.NameBlock(@character_name) = 1)# b2 y3 o# t, W5 r% i% {3 Y
  2. BEGIN8 C) |" p# ^- _2 o
  3. SET @sp_rtn = -12( G3 e0 z; _7 q5 c
  4. RETURN9 `. U' L8 t* ~/ F2 D% x7 h
  5. END
复制代码

/ P' `4 a, R) u: ^+ h: t
1 b* n% o# d6 I0 @) }$ n+ S) }9 N+ D* l
% Q& I& t) B) Y
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

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

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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