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

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

[复制链接]

151

主题

322

回帖

5559

积分

管理员

积分
5559
金钱
1760
贡献
3326
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
/ L- Q% Z' |! V$ `4 `+ h0 o" W) U. b4 K4 K, W
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数/ g$ S) [; }$ g3 G
  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 () R+ e& o3 D$ Z" f; ?
  2.     @character_name NVARCHAR(40)4 T/ c* F( c* A3 b1 C
  3. )( z- |& V( R: r# G
  4. RETURNS TINYINT
    ' `+ A2 z: a3 ]! V- o# f& _
  5. AS" _7 }2 q7 r" A) h% B. V2 Y
  6. BEGIN3 h! @0 ?  d+ Z1 s+ T+ I5 T' F
  7.     DECLARE @result TINYINT = 0;
    & ~/ ~8 {6 V( A4 N
  8.     DECLARE @char NVARCHAR(1);
    # w0 L1 m$ C: C% z& X  M
  9.     DECLARE @i INT = 1;& O/ x4 h9 k# j
  10.    
    5 o2 Z/ M) B+ ?0 Q2 S
  11.     -- 遍历每个字符,检查是否合法
    7 L* i. t- q9 H- O/ w# R- R$ B1 v
  12.     WHILE @i <= LEN(@character_name)- y! L! W6 W" q$ }+ K8 U" @
  13.     BEGIN
    , i, y# t1 {$ J6 {9 h# Z
  14.         SET @char = SUBSTRING(@character_name, @i, 1);" I  U. V4 C' m/ }  J
  15.         
    1 Q/ Z, C* G3 }. n, v$ `- g+ A
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号+ d' V7 f2 j* f7 ]
  17.         IF NOT (& s: g1 q$ Z# u( |: d1 `
  18.             -- 中文字符范围 (基本多文种平面)
    - G2 P9 f/ b) f+ q& X6 Z
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    ( q% i: P7 ?& |6 b9 q
  20.             -- 英文字母和数字
    4 }5 m$ J0 o$ g1 \: F
  21.             @char LIKE '[a-zA-Z0-9]' OR5 v8 A7 `! q7 H# s% o. |' n3 g
  22.             -- 允许的特殊符号
    0 T4 m2 c. e2 T- S3 r. Q( H- I
  23.             @char LIKE '[_ -]'# q: t  \. r! J+ M# i0 [  ^
  24.         )
    ) R$ [7 ~" m# A8 {
  25.         BEGIN
      W2 p$ Y, y9 v' _- T! n
  26.             SET @result = 1;  C, g. j" h. C* E
  27.             BREAK;* |4 x/ _! r5 z6 O
  28.         END/ h$ Q% C4 h' V* x5 H6 X
  29.         
    % i; y7 S* z! ^( B. R6 P0 Q
  30.         SET @i = @i + 1;
    4 L* d! ~8 L9 ]
  31.     END;8 Y& a5 k9 F) Q/ Y
  32.    
    / x9 D: |+ X9 e6 `
  33.     -- 检查是否在非法名称列表中
    % [# M5 o# q/ h5 |
  34.     IF EXISTS (
    + I8 Q0 }* f5 e- ?9 j: Q, j! ?4 l
  35.         SELECT 1
    . U5 L* c3 H' c
  36.         FROM dbo.illegal_character_names
    8 ]3 @4 U% m) H$ j( u
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    , Q$ I1 ?0 Z+ t9 r: ~# _
  38.     )
    # K1 U( c( g  F) k0 m
  39.         SET @result = 1;6 P1 `) Y: G8 ^
  40.    
    5 A' H9 ^: M  N$ {
  41.     RETURN @result;7 V/ L' K6 i2 t& \8 c5 x; N8 F
  42. END</span>5 ?4 J4 U4 H2 F" k3 j) h
复制代码
插入屏蔽的字符
( W0 U0 N( L; g6 C& I/ u2 _7 S
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    5 X1 E5 D! R  a7 ]
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    / T4 w5 }5 K/ E7 k, w3 ^" y* N
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    ( O. z/ i6 k( L" U
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');% L) L. d! Y! z1 p
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');  i! ^+ G0 m7 K4 s3 L

  6. ' ~  `: d3 N0 f
  7. -- 示例:查询包含敏感词的角色名* @4 u6 A! W& f& E! V
  8. SELECT *
    7 o2 T0 e: [7 @% Q
  9. FROM dbo.characters
    * w7 d5 m7 p8 L8 h- y6 W2 r
  10. WHERE EXISTS (, V. q" L+ I+ N6 @) K7 w' S
  11.     SELECT 1
    % [- _) H; S6 b& s% `* K
  12.     FROM dbo.illegal_character_names $ W& ]% |$ n( F: I* T: Q
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    ! B- y8 d6 j$ u
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
# i2 J( ?6 W+ L5 c, T$ `, y! o原始为:2 H* \' l/ }' r6 y
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    9 T) y0 D9 ]2 e1 g# M
  2. " G6 ~1 ]# `* F' ~
  3. IF @v_ret < 0
    1 N, {+ k( X: c# }
  4. BEGIN
    8 \6 X: i2 ^- U) G; |
  5. SET @sp_rtn = @v_ret
    ; u5 p6 i+ F, ~: @
  6. RETURN. v' `& a* G) h- l
  7. END
复制代码
修改为:
  g6 j& ~! v, T2 z5 h0 Q0 o" ]0 t
  1. IF (dbo.NameBlock(@character_name) = 1)
    7 `( h  P7 h7 R
  2. BEGIN* }3 I7 d: J. P+ R, @
  3. SET @sp_rtn = -12
    5 `# S1 L* Q1 I8 ?% o3 z
  4. RETURN
    . a2 J3 m/ G( ^% P$ X* D
  5. END
复制代码

* K9 V- C7 y" p+ T! y$ B) C% i$ l! p3 J2 O0 S

8 R( k* V5 I' e+ m( m6 f% }/ E

& R$ }# }' i% a! D; ?4 [
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2025-10-31 01:53 , Processed in 0.052339 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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