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

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

[复制链接]

161

主题

389

回帖

7509

积分

管理员

积分
7509
金钱
2167
贡献
4792
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表6 o3 E; q' a: m
" n4 G6 [. G6 ~0 W1 s! `' I
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数; c0 }$ N1 f9 G9 J7 i! t3 H
  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 (: ]: x" @( t( ?
  2.     @character_name NVARCHAR(40)
    ! p% G6 z0 @( m
  3. )/ G7 |/ S  G3 x5 Z
  4. RETURNS TINYINT
    & C* T$ {! |, Y  J- D1 T/ G" `$ p
  5. AS
    ; U+ ]7 `( ]+ H; u
  6. BEGIN
    3 y5 w& q4 `1 M3 i' r+ |+ p
  7.     DECLARE @result TINYINT = 0;
    / m$ {6 p/ T: X5 ]# S- }
  8.     DECLARE @char NVARCHAR(1);; q0 K0 f  o- C% n1 n6 x, T4 }/ Z, i
  9.     DECLARE @i INT = 1;* |- Z$ m& J. ]: r7 T! U% b
  10.    
    ) Z5 S, L# c* g: M) E
  11.     -- 遍历每个字符,检查是否合法" a* E8 A5 X: r% N! r4 V) p
  12.     WHILE @i <= LEN(@character_name)
    5 [& {: a( ~; R. g' R4 D! H
  13.     BEGIN* b, N1 b% D+ ]; W/ m6 W+ z5 K# _$ r
  14.         SET @char = SUBSTRING(@character_name, @i, 1);. c  d. H3 M1 F
  15.         
    4 Q$ o2 q! l2 Q2 O
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    3 \# d; s) [$ H$ u/ R' Q$ N
  17.         IF NOT (0 p+ |- b- G( U$ ^7 X
  18.             -- 中文字符范围 (基本多文种平面)
    ! g! G  B! q* i: U, @0 Z) s
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    7 m: }! {; s& J$ x8 G6 o
  20.             -- 英文字母和数字
    $ S- `+ l2 A0 j) n( ]
  21.             @char LIKE '[a-zA-Z0-9]' OR
    * y! N# V2 a0 C8 N
  22.             -- 允许的特殊符号  U- x7 ^# V2 w; t. J
  23.             @char LIKE '[_ -]'- x. k, C  f5 r
  24.         ), ~& U" x: @# e
  25.         BEGIN( Q- z& R# C  i+ @* \' ~4 C+ b
  26.             SET @result = 1;; w: W- W; t0 F& Z
  27.             BREAK;* Z3 R1 q& A5 ^" z3 ~
  28.         END$ @0 b* M0 f- Z6 V3 r4 Q- Y( d% m' n
  29.         ( J5 V3 n) e( V: ^
  30.         SET @i = @i + 1;0 g3 T/ t2 x& ~; j. P- i+ P( S
  31.     END;
    * @9 c- I& E! F* ^5 |
  32.    
    7 y. s* U* t9 Y  ~
  33.     -- 检查是否在非法名称列表中
    4 f; V; h: _* k! s
  34.     IF EXISTS (
    9 j! K* a0 B+ i
  35.         SELECT 1 2 p* }( _( i  i1 b1 E
  36.         FROM dbo.illegal_character_names
    0 b# L7 o' Q  a# F9 w, H
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    ( P/ ], R0 }7 o) d0 c
  38.     )% @0 z! F, i/ v5 }: z+ u$ B" C
  39.         SET @result = 1;1 k  J1 F0 s1 {
  40.     " h( R; o$ _! o. k- U4 E$ O
  41.     RETURN @result;
    0 ]8 t+ a' Z" [0 V' }& v- P
  42. END</span>" J8 ]5 O, z( |" `5 O/ y
复制代码
插入屏蔽的字符) [- ]6 u$ ?% P- R+ j
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    % G6 G' A% I5 p; Z6 M- I* R7 l
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    * n8 P& x, c, Y1 s& b
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');* v) s/ l4 c" a6 \, p/ W& _% A- H
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    7 D* w! P+ U, ]/ \8 s0 }
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    ' }* e0 [! N& s% r' V

  6. - W! B$ r5 I" i' o* t0 E- {; Y
  7. -- 示例:查询包含敏感词的角色名
    ) i7 z' R7 O9 G( B
  8. SELECT *
      I# ~. ~$ t; z* y0 O( N# C
  9. FROM dbo.characters
    # O9 @* b0 S8 Z& b# N7 v, f
  10. WHERE EXISTS (  N: a) s3 e8 S6 v+ b
  11.     SELECT 1
    : |* n9 s" l& \
  12.     FROM dbo.illegal_character_names 8 \- I; n& ^5 G5 S# Q/ J
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    1 X0 H0 N0 T; @3 T" x
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
+ `9 q3 e5 m" O6 f( t' r原始为:
; I, J! O# x, J  J+ n' e. ^
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT/ E6 }7 V  S9 `0 _% W

  2. ; i# c4 l/ s; V' c" ]* c
  3. IF @v_ret < 0
    ) O; z& J4 x" e/ k* W: I
  4. BEGIN
    2 E2 g) K, s" U$ r
  5. SET @sp_rtn = @v_ret
    ( U2 [7 ]( L  C. V; A$ g0 T  I
  6. RETURN
    & v! j# z( P4 S1 j. |
  7. END
复制代码
修改为:5 d; M+ o2 S$ q  F& U, d: q
  1. IF (dbo.NameBlock(@character_name) = 1)
    ; K) g; }9 J0 ]. |
  2. BEGIN
    # n! \5 [8 w% k! |! p
  3. SET @sp_rtn = -126 l0 X/ ]1 g* v( W
  4. RETURN
    2 L: t, C5 s# W, h! a
  5. END
复制代码
; C7 \5 \, J$ `
. R9 i' g. `' F) |8 `1 G. |

# H. w7 v0 h  ^7 K
: e) }' B1 b7 C  s
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-5-18 13:42 , Processed in 0.038611 second(s), 28 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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