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

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

[复制链接]

161

主题

389

回帖

7509

积分

管理员

积分
7509
金钱
2167
贡献
4792
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
+ K# s/ q* Z7 }+ Z! U" g( l" }# {! \, y$ U- W3 q# h6 o. c# H
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
1 q9 F) M- V  P- g. z  l0 o) G& K4 P
  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 (
    # b4 {9 o" Y; @' m5 R
  2.     @character_name NVARCHAR(40). b3 j2 K5 h. |* }" ?4 L( \/ R- y
  3. )
    ' F0 @2 o- j) Q3 N+ j
  4. RETURNS TINYINT
    * f- Y" |: O# [) t4 t; {
  5. AS- I3 W$ ]) G0 Z6 s2 `( ~+ ]
  6. BEGIN" W+ f8 A5 G4 H. `' j
  7.     DECLARE @result TINYINT = 0;
    9 C. C2 s3 b, P" Y+ S* {
  8.     DECLARE @char NVARCHAR(1);
    4 K( F9 E  l. j# Z+ S2 {) a
  9.     DECLARE @i INT = 1;9 q0 ^* r) l, @% t  i- ]
  10.    
    ; [/ j: Q6 V$ m7 M! O; Z
  11.     -- 遍历每个字符,检查是否合法
    ! l* `) d# O) S, l
  12.     WHILE @i <= LEN(@character_name)3 N; _; f; _( e6 I; q# n
  13.     BEGIN6 V9 b8 S( i# w% C
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    ! K0 }+ N/ _+ Z  h1 y
  15.         
    $ \% l, w3 U& e+ H4 g
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    & {) q5 }3 y8 @1 g
  17.         IF NOT (  g2 c- a, t8 [# k2 W
  18.             -- 中文字符范围 (基本多文种平面)
    / ^; u# Z0 }% P. p* N, f
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    % f+ D5 I0 X4 _8 a+ v) @* W
  20.             -- 英文字母和数字3 |8 n* r6 L2 W
  21.             @char LIKE '[a-zA-Z0-9]' OR
    / D( {$ ~3 i& n3 g4 g" f
  22.             -- 允许的特殊符号
    0 r1 p( L( G3 B6 g% ?% ^- C
  23.             @char LIKE '[_ -]'
    ' s! l0 y) p1 z$ X4 t2 h
  24.         )
    1 ^8 c3 a( W& H: o9 J
  25.         BEGIN' O! n+ A9 V! F& \7 {
  26.             SET @result = 1;
    ! U9 G6 k$ ]) r( ]9 [
  27.             BREAK;0 m8 J  q. w8 K2 k1 x& p
  28.         END5 U( w- J! V+ M8 N- Y$ E
  29.         3 n8 _( m3 q/ w( ?: ~% g( J  S7 i4 z4 K
  30.         SET @i = @i + 1;# h8 b- G7 z9 v
  31.     END;
    % I+ h7 y' t: B; ~2 [0 D
  32.     6 e) N* J. C5 S& K, o; r0 b. c
  33.     -- 检查是否在非法名称列表中7 g8 O. G$ p! ^& ]/ b0 b# l5 S- q
  34.     IF EXISTS (
    , R8 }) a  d% Z6 r
  35.         SELECT 1 - b9 S, z! E2 P4 h$ _
  36.         FROM dbo.illegal_character_names
    7 c# W, ~/ i# Y6 F/ S7 z+ p
  37.         WHERE @character_name LIKE '%' + partial_name + '%'. b% D. w, z5 g' v* g, X
  38.     )
    . g$ U* d# i; S/ w3 P
  39.         SET @result = 1;9 a  V7 H9 C+ D1 H8 |2 t9 C0 _
  40.    
    5 m  ~( Y" g7 C) |3 Y+ J
  41.     RETURN @result;6 y5 M1 N9 F' _
  42. END</span>6 }  M" G( p2 n* K
复制代码
插入屏蔽的字符! \( L4 p) D( t
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    & x2 S1 r6 b* `9 u2 N! ^
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');! a! E# l" |1 u8 Q+ W
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    + i8 c0 U7 C. U+ I7 y, V  m; `
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');. Z9 R% n' d* k1 n/ m, B
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    . @+ _8 q% T" w: h
  6. $ H% m( D/ g: m+ l- M3 o7 c
  7. -- 示例:查询包含敏感词的角色名( Q( j. z4 _7 w$ y! a: h0 f  h2 U
  8. SELECT *
    : r2 y6 v% m# n, s5 O' V
  9. FROM dbo.characters
    : a' B9 n4 b/ P" A* H% }5 p
  10. WHERE EXISTS (
    9 ?( A! S" W0 Y, p$ b3 [
  11.     SELECT 1
    ' W* P8 o: C5 }# Y
  12.     FROM dbo.illegal_character_names . U4 \5 ^7 f; D( x/ c
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'3 T5 @- X, Y& _) h: J
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据0 t$ ?, ]1 }. n' u
原始为:
$ Q6 ]; p" s" A3 F, Q; ]' v1 I
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    " }& M+ {( ]; |9 Z( h
  2. . x- s7 j! }2 r+ A
  3. IF @v_ret < 0
    / E, b9 ?) X0 Y7 ]
  4. BEGIN9 R; w& R; i* c3 D$ u
  5. SET @sp_rtn = @v_ret
    ; |( G' i- Z7 {+ C* q# y0 X
  6. RETURN
    1 @  _8 r* }, q; X: D0 L
  7. END
复制代码
修改为:! Y% R& i' o, n+ g/ r3 w
  1. IF (dbo.NameBlock(@character_name) = 1)7 u* I1 T! S, ^0 r8 T5 D% Y# u' j
  2. BEGIN
    ' B* {6 V. m# U/ P
  3. SET @sp_rtn = -12
    5 F, Y5 d/ `3 l: s+ g* w1 m
  4. RETURN
    # j! w: T( ~/ {$ ?$ X% z
  5. END
复制代码
" ^9 X% g# j% R, ^2 f
7 D' F' p- [# u1 R6 j
7 a$ Y2 |' }3 E( Q3 K
$ C" U+ A5 ^7 R! m9 Z6 a+ Z
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-5-18 15:17 , Processed in 0.030386 second(s), 28 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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