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

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

[复制链接]

165

主题

418

回帖

7942

积分

管理员

积分
7942
金钱
2324
贡献
5035
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
  W5 |- Y0 I% ~6 X  t. t
- y. `+ g0 H' z) a) R
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数$ a9 [( g8 Y2 Y8 _
  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 (" q" d3 L5 o4 G0 O$ }+ W
  2.     @character_name NVARCHAR(40)
    6 k( x" |% O  I- U; v# n2 }$ J
  3. )% M0 c$ F  R- v! i3 [1 b1 D
  4. RETURNS TINYINT) a$ K* H( W9 l4 R" y
  5. AS
    2 d1 S% l3 Q, R
  6. BEGIN+ j& `* h' b- V: e
  7.     DECLARE @result TINYINT = 0;( i7 U4 x: o+ U+ ~
  8.     DECLARE @char NVARCHAR(1);' I' x, }' M8 b9 s- {+ B
  9.     DECLARE @i INT = 1;7 t+ h. A3 Y! d
  10.     ; U; I9 ~$ i, r  C+ Y
  11.     -- 遍历每个字符,检查是否合法
    7 n0 c! N  ?" w( r4 ^9 K6 y& H
  12.     WHILE @i <= LEN(@character_name)
    4 q* M; a% K, C
  13.     BEGIN. V* U( o. C* i5 e5 g( ^9 k
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    7 k, R- P; |7 ?9 ^7 R
  15.         
    6 e2 H2 q$ X8 H" Q" F6 V; C% [
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号- b  A+ _$ @$ V: G1 T
  17.         IF NOT (
    ; O; z+ A7 m3 d. \2 B
  18.             -- 中文字符范围 (基本多文种平面)
    - j4 }7 i4 G6 j3 V! ~
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR. @" f1 D" Q- B. E, o# z
  20.             -- 英文字母和数字+ U* }, Y% @' ^$ d. E3 C, u7 m
  21.             @char LIKE '[a-zA-Z0-9]' OR
    5 ^6 }. O' L: v$ J, p- |8 _
  22.             -- 允许的特殊符号$ P6 ]- B+ A! L0 U: c: _+ y6 ~
  23.             @char LIKE '[_ -]'! y7 }: `; H  F! ]
  24.         )
    & H" ?9 A5 s6 d
  25.         BEGIN2 ?/ T( W+ l( K  G2 A
  26.             SET @result = 1;  m' [6 c9 r, W; T% n2 E
  27.             BREAK;8 {, k/ _5 o! ?, G8 T0 f
  28.         END
      \0 h3 u) ]! J
  29.         
    3 ]' g% x0 q9 Z3 Q  ^' @) E; M; F
  30.         SET @i = @i + 1;
    4 X* g+ m2 a$ V5 V% K0 j$ ^, s' ?
  31.     END;
    , W6 C/ d) Y7 w
  32.     . \# F' {7 C5 N+ d7 E
  33.     -- 检查是否在非法名称列表中
    : B! Z2 S0 X# T' l; K( G& V: v
  34.     IF EXISTS (
    8 q) m% b% g% l: j8 i$ N  y( U
  35.         SELECT 1
    5 h" T( `. O2 @. G. w
  36.         FROM dbo.illegal_character_names $ R% q; N5 R+ W- s; N- j
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    , d/ m1 n% B/ m# b+ {& p9 k
  38.     )
    3 ]. F0 c: j& n5 ~; C
  39.         SET @result = 1;4 z- X4 t# }% ]
  40.    
    1 X: P  p9 v; O! {4 G3 Y  Y
  41.     RETURN @result;
    # G3 \8 n3 c4 P. X) H- P
  42. END</span>' T* m. |1 Q  f, d7 c3 e
复制代码
插入屏蔽的字符
9 q: x( _( g8 U
  1. -- 插入非法名称列表(明确列名并使用N前缀)7 I* [- K0 f4 o/ b4 }
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');( _. ?7 d1 C! j: V/ D
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');5 m) ?' b+ l) N( Z0 h
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
      q3 r) v+ B( D8 F
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    + V1 ]5 K3 s  q
  6. " o, R! m$ D9 e4 ]  `! e# u% b
  7. -- 示例:查询包含敏感词的角色名
    * e7 Y+ J7 W# j  d3 s6 s& k
  8. SELECT *
      T2 W* r" y& ^  I- M
  9. FROM dbo.characters
    / \; I" v( `" f$ g' h6 E
  10. WHERE EXISTS (
    % W' g! d; k4 j) @% O
  11.     SELECT 1 9 G- X# a; Y9 h  X5 x  J3 y
  12.     FROM dbo.illegal_character_names
    1 K5 a7 C, K1 w; a+ o
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    * m( u' k4 E( m" y: P; ~* H
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
4 a) _: ~, \# r- m$ s# z2 V4 z9 F/ n原始为:
, e4 {$ ^" V$ t+ f9 u4 u+ _
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    0 y9 N. o+ i+ S, U3 Q" N! p, j% N# a
  2. # n8 _3 L7 O4 F, w* o
  3. IF @v_ret < 0 8 S6 _3 h1 I6 q7 Z& W% I
  4. BEGIN# S$ S* X) t9 o. l9 g! V
  5. SET @sp_rtn = @v_ret, H. s+ Y0 I/ A$ Z/ d
  6. RETURN4 X* E& g* H, ^- X0 c
  7. END
复制代码
修改为:
& g# H4 w7 {1 s1 m; W! }
  1. IF (dbo.NameBlock(@character_name) = 1)9 `" Z6 q4 H9 ^6 v
  2. BEGIN8 G! v1 a8 k8 y7 z) P
  3. SET @sp_rtn = -12" L. ~. d/ @2 f( {
  4. RETURN4 l$ @% [  L1 d. Y2 ~
  5. END
复制代码

% p- ?: X0 [+ p& [% @# Q' d" ~
) a1 x: Q- m/ j
' l8 }' h2 U0 u3 A& @1 \

9 k& w- Q0 a3 ]2 r6 F. f
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-8-17 10:24 , Processed in 0.057097 second(s), 29 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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