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

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

[复制链接]

164

主题

416

回帖

7823

积分

管理员

积分
7823
金钱
2284
贡献
4959
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表2 n4 w0 ?1 s, G7 o) s8 |9 ^

9 F1 w9 X1 f0 H% s
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数0 S- ]+ @( t* Z- O1 K( `
  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 (
    3 Y  {3 s& u3 U' @1 x/ [
  2.     @character_name NVARCHAR(40)
    4 C; ^7 T5 j8 q* h
  3. )) f/ M& h  Y, G" ^6 F- p; V
  4. RETURNS TINYINT
    3 Q9 O" T& a2 C, y
  5. AS1 o% n% n6 T0 h
  6. BEGIN
      u& P) e7 ^3 k
  7.     DECLARE @result TINYINT = 0;
    8 Z; i8 f, s& N
  8.     DECLARE @char NVARCHAR(1);! U0 c0 O; o% k2 }
  9.     DECLARE @i INT = 1;
    % t) U, X, @* h' S7 i3 v# T
  10.    
    ' ]6 ^, ]; F9 R& q
  11.     -- 遍历每个字符,检查是否合法
    ! J) P, p' P  `0 y3 H! R
  12.     WHILE @i <= LEN(@character_name)4 Z1 [  n9 `/ x7 L5 b
  13.     BEGIN6 U3 W  a( W; ?: Z* H' h
  14.         SET @char = SUBSTRING(@character_name, @i, 1);$ h( T$ A5 _9 a8 o2 }: z$ x
  15.         
    : T2 i  T' C" i4 f) m
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号; ]. J: i; e; w1 h
  17.         IF NOT (' t- V' G  s* O
  18.             -- 中文字符范围 (基本多文种平面)
    0 H" |+ G2 |: [6 A! N3 T6 T
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    ' x" C& d" H$ f3 V
  20.             -- 英文字母和数字. B: c* m" p8 l* Y, O4 L
  21.             @char LIKE '[a-zA-Z0-9]' OR
    8 r: A! W- k6 K' Y
  22.             -- 允许的特殊符号
    - {3 d1 R7 F, n/ ~; @6 A
  23.             @char LIKE '[_ -]'8 |9 O6 p0 e$ m6 \8 [
  24.         )
      {8 m1 ]3 K" X
  25.         BEGIN# p( ]( p; y" u1 E
  26.             SET @result = 1;
      k( t. s3 {, O) c. S
  27.             BREAK;2 R& A, @. d. |
  28.         END1 S9 y' \* Z# ?  ?
  29.         
    4 {# c2 B) e( D& P# i) N0 v
  30.         SET @i = @i + 1;1 P$ e* m  h# v# X
  31.     END;
    " T1 l( J- v2 l& d
  32.     7 o* _6 j: Y: V8 I/ m& r" B; Q
  33.     -- 检查是否在非法名称列表中
    , \- [( z$ ~& _6 X  ^4 X4 Y
  34.     IF EXISTS (
    % K/ Y5 N' P+ l: D- a5 a
  35.         SELECT 1
    0 y8 o; O. k7 ^4 T: u# C; P. z
  36.         FROM dbo.illegal_character_names
    3 g' F" t  `! d& \) r
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    8 u) {  P: R1 W- q9 Q# W
  38.     ); y$ w4 ?& f2 G! A' N) b
  39.         SET @result = 1;
    0 T7 D- ^, C8 Y" a5 b$ ?! w
  40.     : I* V6 R, P, D2 i  R
  41.     RETURN @result;
    / y% l; @3 d: i$ E# a6 H3 w6 ]: N
  42. END</span># R5 j  z, h) Q. J3 L/ E
复制代码
插入屏蔽的字符
- O+ w" h8 E/ f8 W) y2 e' ]( T
  1. -- 插入非法名称列表(明确列名并使用N前缀)2 x% D+ k3 ~! k; Q4 k% m* W  c5 ^
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');  L4 ^# U% J2 H" ]
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');1 J$ N2 i! V) {" }$ m3 d
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');# Z% O6 r+ c. ~* D& G; y% `- Y' ~9 t
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    + J7 j: \, ~( Y! v8 {1 i
  6. / P  e# x8 O$ Y
  7. -- 示例:查询包含敏感词的角色名
    / J% L: j$ Z, M4 C- Z1 T/ M/ Z
  8. SELECT * " M7 E* A) _6 @  d' D4 l, [$ g) _& F
  9. FROM dbo.characters
    ( u* L" K8 l( M! X  H2 j
  10. WHERE EXISTS (
    ( Z5 H- B8 d. w
  11.     SELECT 1 : N9 s" Q2 r9 g+ U
  12.     FROM dbo.illegal_character_names
    0 A& P0 t- I1 t3 n4 A7 \( N3 K
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'1 @* S! S: F/ ]4 s1 \8 V
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
0 L0 W% k! ]8 g% l1 _原始为:
; c  X" \7 Z0 t4 _1 z
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT% t8 }7 A; ^4 W, E- U; l  [8 h+ p
  2. . h9 j+ W% |9 ?' |. H  i
  3. IF @v_ret < 0 % _7 N" {1 _" |
  4. BEGIN1 m4 o8 ^5 r. n  |; C5 L
  5. SET @sp_rtn = @v_ret* \6 j4 {3 [, k  {$ V1 ~
  6. RETURN
    + `$ |/ i7 t- `$ h- Q
  7. END
复制代码
修改为:
9 u2 T4 {( E1 y, m& {1 o& f( p8 \
  1. IF (dbo.NameBlock(@character_name) = 1)
    / w& c) }; L7 b/ j
  2. BEGIN
      C- q7 [8 m. b) h0 H# z2 M
  3. SET @sp_rtn = -12
    ( D' e( Y6 j+ @
  4. RETURN. [; e0 _( ]2 d/ ~
  5. END
复制代码

8 n5 n$ D- g: p3 T$ R- i1 ]- W- O& D4 o( D$ r" j  W, |* `  _

$ q6 F' p% |- r2 m! Z% G  A) w
; X1 r! ~: W2 B" ?% y
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-7-7 21:45 , Processed in 0.138848 second(s), 29 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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