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

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

[复制链接]

151

主题

321

回帖

5508

积分

管理员

积分
5508
金钱
1753
贡献
3283
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
8 S: F: i: q# y* @3 H
# s9 Y# ^& K0 f
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数% K1 D/ C% t0 D/ H) }7 i1 q6 ~  [
  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 (2 r* \2 G8 o. m( Z5 f+ o
  2.     @character_name NVARCHAR(40)/ j# D2 b. r$ p9 L, c
  3. )- L/ ?& B) c* {0 b  Q
  4. RETURNS TINYINT
    " W+ y( n. c& g( v
  5. AS- H0 G- [/ k6 t% ?# y4 Z
  6. BEGIN
    8 q+ \. u/ u2 D$ N: {1 \( {
  7.     DECLARE @result TINYINT = 0;
    ! _; u' Z0 A/ m" ~8 o
  8.     DECLARE @char NVARCHAR(1);: s3 L8 T6 W0 P% {) Z
  9.     DECLARE @i INT = 1;
    4 H  S2 w( F( r/ e' U+ {
  10.    
    ; C. k+ i$ f2 _4 D3 r- S( W* A& \
  11.     -- 遍历每个字符,检查是否合法
    0 S9 w% g/ E! A! n6 o
  12.     WHILE @i <= LEN(@character_name)1 C1 ]' X1 ^$ j
  13.     BEGIN
    0 r6 \+ J; v- D' [4 A! N5 U  p
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
      {( e- H& M0 t
  15.         
    2 Z8 J- Z; O! g4 F: b2 F8 f
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号5 r; ~) W" p/ l; k) J# U$ X, J1 j
  17.         IF NOT (
    9 _! W# c* d, v; X
  18.             -- 中文字符范围 (基本多文种平面)' p2 U7 d% [; r4 n5 R
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    , P3 A7 G# |( I( i. e$ ]) U
  20.             -- 英文字母和数字
    & v" I$ a2 N' Z
  21.             @char LIKE '[a-zA-Z0-9]' OR3 P- S7 H0 p& ?3 j& L! j& y) _
  22.             -- 允许的特殊符号
    $ U6 K; K6 b8 w$ a( q
  23.             @char LIKE '[_ -]'/ }; B% G# `$ A! v, Y
  24.         )
    / v: @6 \0 j  Z
  25.         BEGIN
    * a8 Y$ k9 Z: s0 m* z: ~, l
  26.             SET @result = 1;* A* b' e% ^) k. I# @9 n) F
  27.             BREAK;
    % Y% f4 R9 C+ G; `) e5 `# Y
  28.         END
    9 I) N, U" l6 H9 v% L8 H
  29.         ' \- i% g% P" Y
  30.         SET @i = @i + 1;
    2 R, Z+ \9 V! T+ _
  31.     END;/ m" @% E6 A  h. Q4 x
  32.    
    : U6 s, a3 ~+ I6 ]% _5 ~
  33.     -- 检查是否在非法名称列表中3 k  H" O5 W) o+ P" S
  34.     IF EXISTS (
      c3 H  j, ]1 e9 j; s
  35.         SELECT 1
    ' n- @/ H1 P$ L! L, p6 S
  36.         FROM dbo.illegal_character_names ( v/ W' y  u) a" F3 b" i
  37.         WHERE @character_name LIKE '%' + partial_name + '%'( g5 Y9 B, Y7 {* g
  38.     )
    ' W' S$ Y6 t9 e$ w, H
  39.         SET @result = 1;. Z$ I7 K7 a/ z2 i$ e' m, Z
  40.    
    7 U1 @9 I5 ~+ V2 ]2 A  ~! _
  41.     RETURN @result;$ m% h& ^, [* c9 g( N/ z$ ]7 E4 D
  42. END</span>
    5 Q- o# s" I" t$ U1 A* E
复制代码
插入屏蔽的字符
0 S  [1 g% h! O9 ~) f1 p7 }: u1 c
  1. -- 插入非法名称列表(明确列名并使用N前缀)2 `" G! M# \5 f) A3 H* z/ i' m' R
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');: q0 Z( T% o% M
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    % v( U2 i0 q$ o, K
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    & |" ^( k  H% R: o: e
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    6 J: ^! S6 L4 r

  6. 0 Z$ O( N# v- x7 K; Z1 M
  7. -- 示例:查询包含敏感词的角色名
    4 ^) J5 `+ r/ e
  8. SELECT * - }8 `1 [6 {5 f4 d: J2 ]
  9. FROM dbo.characters + O: q( W' G3 g" H) R( ^
  10. WHERE EXISTS (/ H" R/ y& J  w: Y( ?& e. M
  11.     SELECT 1 8 ?- \, A9 l# R$ S: I
  12.     FROM dbo.illegal_character_names
    % ~" E$ P5 N( U' w& f* j+ K% L6 |4 @- h
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'! Z$ _4 g1 E: r( ~; c( C
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
! T" S3 r& }$ \; U" K- z原始为:
' M& i* P2 u6 T4 q0 c  T
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT) A9 P+ p3 N9 f9 G

  2. 5 g5 N3 G6 A8 i
  3. IF @v_ret < 0
      \: }4 N9 q8 R7 \9 x
  4. BEGIN
    - ^0 b% g! J8 c
  5. SET @sp_rtn = @v_ret
    ) r! |- n" j* t  M$ s
  6. RETURN" K% C& K% t0 S" u" b# |5 j
  7. END
复制代码
修改为:/ \7 Y  C( \1 D6 e+ {: m7 ?6 t$ W
  1. IF (dbo.NameBlock(@character_name) = 1)
    0 q5 h) W% v- S' }  l/ b
  2. BEGIN9 m, v7 J: D$ a$ d9 X2 W$ H4 u
  3. SET @sp_rtn = -12
    " W: r/ V& r7 ^6 J- B( ^
  4. RETURN; {* U' N; D) g7 ^4 N6 s
  5. END
复制代码

2 p5 d) O& W! P, b& B6 w  ~( b9 w- b& @6 h( K
6 I! x* |/ g+ |, Q) [( H8 ~
3 A6 W1 R9 W% R
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2025-10-27 09:19 , Processed in 0.057086 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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