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

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

[复制链接]

166

主题

426

回帖

8133

积分

管理员

积分
8133
金钱
2380
贡献
5161
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
( E. w- [0 f3 S  i! a
: h4 V2 r8 v, W6 v* |* ?
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
5 z1 f5 A+ J  O9 ]& }1 m
  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 (. Y" e8 U! h  g3 S) l' b$ C8 p& f
  2.     @character_name NVARCHAR(40), w' h0 i! y" d; x- u9 V, ]' g; f
  3. )2 h& P2 R1 L( Z$ Y' _
  4. RETURNS TINYINT
    ' b3 ~+ O& a% y
  5. AS
    9 O& N4 z9 l9 o6 c
  6. BEGIN
    ' C4 J3 W& j. f) T
  7.     DECLARE @result TINYINT = 0;
    5 }9 F6 r- D* c$ C
  8.     DECLARE @char NVARCHAR(1);
    ! d2 _+ }0 R( S& D8 ?4 _; R; c1 R
  9.     DECLARE @i INT = 1;- }. s9 f: E; ~& O9 d( \+ O2 D  z
  10.     4 z) A2 o3 Q8 J* v( L# Q
  11.     -- 遍历每个字符,检查是否合法
    " M0 \% d5 w2 Y4 {
  12.     WHILE @i <= LEN(@character_name)
    5 }: i' k# F* {+ A" O
  13.     BEGIN+ ]; G, D; Y- V  d/ r7 N+ ^) @5 y; r
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    " r2 q, h8 Y- Y/ Z1 r/ h! @
  15.         
    . ~6 r0 a: w$ a
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    2 g$ w  U; ?2 Y8 l* Y
  17.         IF NOT (4 N' Q* T) W  \; e) _
  18.             -- 中文字符范围 (基本多文种平面)
    , ?1 r% H0 {1 h) w# R
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    : {$ N: _" G* [3 s
  20.             -- 英文字母和数字
    1 }# |! I7 P- K2 I
  21.             @char LIKE '[a-zA-Z0-9]' OR
    2 s" y/ o/ |8 F
  22.             -- 允许的特殊符号, Q3 e, @) i# @" {/ @# O1 B$ S8 j: r
  23.             @char LIKE '[_ -]'
    ' ^" ]- l* N, R6 P% R7 G; W4 K
  24.         ): O- {7 m1 J1 [
  25.         BEGIN6 w  l  y1 ]6 ]% x
  26.             SET @result = 1;' _6 a  _9 {% f% `0 v, J" t
  27.             BREAK;
    5 q2 o+ F! o9 g2 p
  28.         END
      j/ k) F/ e, l
  29.         
    4 l! K# Y3 }/ W
  30.         SET @i = @i + 1;
    - q# m7 d% `) r& N: t) S- {
  31.     END;
    - t5 O3 O7 X7 @6 h0 y# O, E
  32.     " ^% d/ K/ J7 z& X* B0 H
  33.     -- 检查是否在非法名称列表中
    # Y. S1 g* s( n( X) `: G: x2 O" V
  34.     IF EXISTS (  T1 z4 t( g/ }" Q- ?, }
  35.         SELECT 1   ?# B- {# j7 g' P
  36.         FROM dbo.illegal_character_names " E* r+ T" \% a; U: @
  37.         WHERE @character_name LIKE '%' + partial_name + '%'5 p% D8 ~, b2 o5 Y& e
  38.     )" R( {% X. D4 u- z  R5 F
  39.         SET @result = 1;  G# ?1 @6 X9 A) v% R) b5 E- z
  40.    
    ; w: @. Q( Q: |( h
  41.     RETURN @result;7 |4 I0 @  q9 j8 @; e1 H! O
  42. END</span>
    * \; U, ~$ ^5 g& ?
复制代码
插入屏蔽的字符  a3 S  F) F  {3 ]1 H* e
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    ! O' C# g% c! J6 C1 g- Q
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    : W% d% E2 K1 w6 [4 w
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    3 X& m; E% F& |$ |* F2 k
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    % e  @) O% D1 P
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    # r7 R8 A4 v+ f$ O  `: }1 ~: v) ~

  6. 2 n$ V: A5 V3 k5 f
  7. -- 示例:查询包含敏感词的角色名
    ; B* y; ~8 r- V
  8. SELECT * $ H# h; X# H9 {) A. V
  9. FROM dbo.characters
    % ~& }/ x* k& G
  10. WHERE EXISTS (
    ! F2 ^" M, n' {( L7 h
  11.     SELECT 1
    ) b- g& k& z" F( Y  G4 d! y
  12.     FROM dbo.illegal_character_names ) a/ o6 ^  c; X8 r( l. L6 o6 k) t
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'8 C: N( L5 C4 h
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据2 {5 i# c6 Y: ]' Z& B2 L: _! c
原始为:
' M0 ^0 e9 `( [: O2 l* @
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    $ v8 e% q+ e+ t# ?. z6 M, `: {$ H3 T

  2. 9 l0 O2 M# O6 S
  3. IF @v_ret < 0 ; d% ]: @/ y3 \0 `: T+ n1 \0 O
  4. BEGIN5 U. e$ B. i& }* D
  5. SET @sp_rtn = @v_ret* ^; Q1 s  S, D* C
  6. RETURN
    . K1 x# I; B9 \) }& |
  7. END
复制代码
修改为:
& T, ]# J+ B6 B8 \5 P
  1. IF (dbo.NameBlock(@character_name) = 1)
    * m, T6 r3 |. i7 w) I
  2. BEGIN
    + @; L/ G% \- a
  3. SET @sp_rtn = -12
    ) N; K* O! i; }9 }3 G
  4. RETURN3 D( d. V+ L6 B5 G3 }6 |6 m
  5. END
复制代码
5 n1 I6 q, n$ C: R$ ^! M& C
5 ^" v7 p. w0 M9 b* [* k0 C
) D. E* Z/ I/ j% z- K0 R$ d6 O9 }" X4 A

/ P: I! t7 ]; G- d6 E+ L
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-10-1 13:38 , Processed in 0.055061 second(s), 30 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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