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

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

[复制链接]

155

主题

348

回帖

6179

积分

管理员

积分
6179
金钱
1868
贡献
3808
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
1 |% w, h" I' u( D. L% `3 M
1 c: d1 C" A2 Q+ L( l
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
7 T: y) ]; s- s% j% H, F% u
  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 (
    # [& D) j0 x; M- w# K
  2.     @character_name NVARCHAR(40)" a3 f9 r6 F; f) q: [% i- h. S4 I
  3. ), v( d7 j6 u" F: S
  4. RETURNS TINYINT
    0 W& O* U/ D+ e( f
  5. AS
    # j8 \7 m. d) D- n* a' \: P' t3 @
  6. BEGIN
    , g7 f( H2 y9 p7 x# D/ u9 J
  7.     DECLARE @result TINYINT = 0;
    7 j8 O; h: z/ D% d5 v. H
  8.     DECLARE @char NVARCHAR(1);
    7 q( c9 n! V7 {0 C2 c
  9.     DECLARE @i INT = 1;
    8 x/ G- K9 q1 T3 K* E/ Z
  10.     $ O; ]3 Y4 B# P( r9 }
  11.     -- 遍历每个字符,检查是否合法
    6 T$ T4 F- }0 ]. W& a5 q
  12.     WHILE @i <= LEN(@character_name)
    . |$ j2 n4 Z3 m6 U$ c
  13.     BEGIN' n" h7 q; g: x0 z* k, {$ |
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    * v0 w' d! Q3 b  |) i
  15.         
    , _0 D! i7 y% K5 p" P2 U% y
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    + U8 b. A) s/ i2 w
  17.         IF NOT (" I) B5 R8 b( V) }) A6 e2 p) v: |
  18.             -- 中文字符范围 (基本多文种平面)
    1 }# w7 p$ I8 Y( \# V$ ?
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    2 w1 D) a  x6 b. R) o* S: ]3 _
  20.             -- 英文字母和数字
    + J2 W$ ^  f+ O& L, m9 l/ D
  21.             @char LIKE '[a-zA-Z0-9]' OR7 q2 d4 \' B  K' r1 X
  22.             -- 允许的特殊符号3 Y6 K: \" W# r4 {1 R6 _
  23.             @char LIKE '[_ -]'
    " n; m# E% _& _8 n
  24.         )! l  Q4 Z. m( Y+ f% O3 \: i0 H8 h
  25.         BEGIN, A. P, B- ?* S! H
  26.             SET @result = 1;
    2 |* z1 L: U" o) l! Y' t3 s1 a
  27.             BREAK;
    # T- P) Z8 L5 I4 [
  28.         END+ r' c9 `5 d4 _- `
  29.         
    9 M2 y) L4 j: @& [" _3 `6 U
  30.         SET @i = @i + 1;
    : b  ]) a1 p  y3 X0 ^
  31.     END;
    0 O- Y) _6 R- T' X
  32.    
    6 `- W' F$ |8 \0 O9 c: G
  33.     -- 检查是否在非法名称列表中$ I7 d9 u% p) N: r! w. s: v
  34.     IF EXISTS (
    & P" D* }4 g3 R2 L# {
  35.         SELECT 1
    " c# D" F# A. W9 C9 a1 o
  36.         FROM dbo.illegal_character_names
    ; |" p8 R9 B1 s+ j
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    : T5 j+ X4 N9 d/ H, [& b
  38.     )
    ! X0 [# q+ c  ]
  39.         SET @result = 1;- A7 f! f  n6 ~2 Y% ^! w. t
  40.    
    4 K" N( a! i- b+ @( j" s1 t2 e
  41.     RETURN @result;
    7 x* P4 p7 q  D5 Z: }, z" v8 F) D6 @
  42. END</span>
    & I* L4 @5 p# G. V, V
复制代码
插入屏蔽的字符4 M  }" }! n0 S7 c3 {& |
  1. -- 插入非法名称列表(明确列名并使用N前缀)+ b: e' O0 t+ v: Z" S  o
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    ( f" U$ q2 B, I. i
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    % [* H! b5 |; O# Q/ Q: O( |- q/ ^
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    " l( {1 \2 [- V& e  i- J7 d- L
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');9 {9 ?: s2 q, h% Y& {

  6. . ]  W$ [; y  _
  7. -- 示例:查询包含敏感词的角色名4 u' V! t$ o" X4 l2 a6 G
  8. SELECT * " x+ |/ f+ v! h
  9. FROM dbo.characters
    5 ?1 c# ?4 n4 s. E. b) a* _8 W
  10. WHERE EXISTS (
    0 T- S: ?! p/ c4 @, V
  11.     SELECT 1 , W' V! V. V& R
  12.     FROM dbo.illegal_character_names
    6 q) k  @- u! a- j$ @7 P. Q/ N( Q
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'6 I" M3 }+ ]3 G$ M, W. }
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据- P  T+ s. g: N" g( a; B0 `
原始为:
+ e' y  g( }6 M8 w- J
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT3 n: ~! B8 R& i1 n  H
  2. 3 J! r: c% G; u4 z7 B
  3. IF @v_ret < 0 & B% y5 w2 f+ T% c8 y
  4. BEGIN
    ' Q, g- ~. H: x
  5. SET @sp_rtn = @v_ret, d' v8 b' E2 @' a- x
  6. RETURN' J% Y; c) a; \+ U9 Y  W
  7. END
复制代码
修改为:
+ ^. V( L. ?4 v6 |
  1. IF (dbo.NameBlock(@character_name) = 1)- V4 U, _. K3 P" U9 x( J+ g
  2. BEGIN+ ]/ ?( o+ h% }, G" k! A( o
  3. SET @sp_rtn = -12
    ! F! Q4 _1 p3 X
  4. RETURN- X2 D+ g% `# x9 ~- W8 Z  ]' A7 L
  5. END
复制代码
* {. `, |$ Y% [
# e  |6 q6 ], w- L1 Z" d' ~* }

  X+ E/ U1 j1 Z6 ~
8 F" ^2 n9 k; Y' {4 N
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-1-2 00:23 , Processed in 0.054167 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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