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

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

[复制链接]

161

主题

394

回帖

7560

积分

管理员

积分
7560
金钱
2182
贡献
4823
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表: ~0 B# b% b( o0 L2 B) B
: U4 R/ n5 `3 H* e
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
: m% b& {" _: P' r" N
  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 () u# J. A, Y2 I  V  G
  2.     @character_name NVARCHAR(40), F% d7 u- @% V+ c/ ~  r
  3. )7 X2 u$ _$ f7 W/ H1 s/ E$ L
  4. RETURNS TINYINT- V  P$ m$ Y! ], J+ Q
  5. AS7 c9 ^5 F8 U5 J6 U6 P0 b
  6. BEGIN
    $ H/ v" A: [9 y( \0 E) \3 p) f
  7.     DECLARE @result TINYINT = 0;
    % g0 k  [1 _$ d
  8.     DECLARE @char NVARCHAR(1);
    5 Q8 p3 O! ~- {. O& T1 P2 j/ e
  9.     DECLARE @i INT = 1;: r+ `3 F/ G8 q' M8 E& ?/ l
  10.    
    . C% X' C4 i5 b( n0 ]% M( Q
  11.     -- 遍历每个字符,检查是否合法
    9 k/ y# Q, D0 B" M) A. Z
  12.     WHILE @i <= LEN(@character_name)
    * b+ A! H2 h. i) d: G
  13.     BEGIN
    3 T; }: y% I" H. Q( O- H0 G
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    ) g" O: w* `$ ]9 r0 B" G/ k/ f
  15.         / @, w$ ^# N3 N5 d2 T0 z' S( h
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    : u) u/ g2 i4 a" m4 x3 _
  17.         IF NOT (( z( f. ?: f+ i4 H. s! v% O
  18.             -- 中文字符范围 (基本多文种平面)
    ! y" c6 T* w/ M' U. s8 L; Z. N
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR/ ?$ m' G. D- Y# _- @! t
  20.             -- 英文字母和数字
    ' r7 Y" n/ E3 j' R6 \" b, p' d' p$ U
  21.             @char LIKE '[a-zA-Z0-9]' OR
    ! }& ?; Q& o1 Q# D4 ]' y
  22.             -- 允许的特殊符号0 b0 p2 _+ V5 b# o0 Q3 n
  23.             @char LIKE '[_ -]'
    " o5 V) T% A6 U# D. }+ C
  24.         )3 s* m% y6 ]3 d& L4 D+ d
  25.         BEGIN+ t9 H/ S) i. ~; R* k0 c% [  `
  26.             SET @result = 1;
      v) D; h. \; e  G4 a$ }
  27.             BREAK;
    ; Q! }' {8 I2 S4 n' P) R
  28.         END
    % `4 }# [+ H) t$ j9 R
  29.         
    8 U) ]6 v1 Q4 v$ Q4 T9 ?
  30.         SET @i = @i + 1;: a7 i; f% V7 n( v, E$ B
  31.     END;% r" s, A& r1 _: j7 W4 d9 y$ O7 l: T* a
  32.     : |# n8 b% g0 V- Z5 K
  33.     -- 检查是否在非法名称列表中' p( b' w" B6 l# h* |9 |( |
  34.     IF EXISTS (
    " a, x7 V" Q! q; M4 l7 l
  35.         SELECT 1
    8 |" |: G, H4 \9 F
  36.         FROM dbo.illegal_character_names : ?( L/ j7 w7 p5 A9 @$ K5 ]9 f
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    & H. x" u* W9 L- k& j% [
  38.     )
    / W/ k1 D7 p5 {
  39.         SET @result = 1;
    % L$ o* F+ B0 W
  40.     7 {% w# g+ e! k$ y
  41.     RETURN @result;- c( t2 b2 K4 D+ [& `+ P
  42. END</span>5 f5 U2 u: O8 G! A: X2 b0 z+ E# [
复制代码
插入屏蔽的字符& g7 E- j" ~+ p4 N7 f: h! O* T
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    ) M( O1 j: A8 l# \& r2 a2 G8 c
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    2 P$ _; H0 r) d9 I3 Y0 q! l
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');( O/ c  V) o. i  G% S# }9 w
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    ; P- \2 O& _7 c9 @5 G! `
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');- o5 p" X! u& ^6 H/ l
  6. 9 |; U9 |( }6 e# _
  7. -- 示例:查询包含敏感词的角色名+ g5 f$ K% K! r! \- n3 f9 C
  8. SELECT * % W" n8 n7 t, c5 K* ^; L+ |
  9. FROM dbo.characters : T& w3 U9 o' O) q$ u
  10. WHERE EXISTS (
    # Z+ O8 X1 \* ?, l# X2 Q! J' @
  11.     SELECT 1 & {7 @# e3 c. u9 s
  12.     FROM dbo.illegal_character_names , A4 j& F( `9 P8 E9 D5 q* ]
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    % R/ i( B3 t; {$ T. k' R  Y) R
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据5 M/ Z/ s5 U" B: L3 N6 p
原始为:* I- ?9 T! k( W+ _6 S
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    2 C3 @/ V/ s# N1 B# X8 x" r
  2. * H' S+ @$ ?/ o: E7 g% o1 N4 d9 K; _
  3. IF @v_ret < 0 , A# b: M8 x, W* u
  4. BEGIN+ x, I/ }; h. _7 j
  5. SET @sp_rtn = @v_ret5 v) X- u: V- @
  6. RETURN% B# I5 R4 |# B# i
  7. END
复制代码
修改为:" U7 v9 K" d9 ^0 J1 s( a
  1. IF (dbo.NameBlock(@character_name) = 1)
    $ b; a% t# p, }0 m
  2. BEGIN; e0 q3 a: L0 e
  3. SET @sp_rtn = -12. L/ S& e) Q1 t. h( h. C4 w3 S
  4. RETURN- d' I6 ?/ K5 m' V+ t
  5. END
复制代码
. L' A( [- v, }! G" o8 Y( o. j

/ s0 c- V, r1 G6 L' y
9 B2 w( e0 n5 s$ ~
' O) T  z( T; f3 l3 _- M7 O
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-5-23 15:58 , Processed in 0.027954 second(s), 26 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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