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

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

[复制链接]

161

主题

389

回帖

7476

积分

管理员

积分
7476
金钱
2161
贡献
4765
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表3 d, v$ L+ H- H. r5 R

3 S/ ~5 F. F/ i
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
5 O4 I: R7 T7 X& o9 f
  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 h9 d$ n! p- b1 m
  2.     @character_name NVARCHAR(40)& |1 j4 }- e. _3 j8 v' ?- a
  3. )
      O; ?% H  H+ x  L- Q
  4. RETURNS TINYINT
    2 J; O: l! D1 ~
  5. AS- k3 \; I* r( D1 z$ m& k) s
  6. BEGIN0 G) V6 X7 ^2 f: }
  7.     DECLARE @result TINYINT = 0;# V; a" _/ }! v9 G8 z' t: s
  8.     DECLARE @char NVARCHAR(1);, O7 I+ \5 `9 L* x) Y
  9.     DECLARE @i INT = 1;& H7 N  s/ q( a$ `) O1 c/ G
  10.    
    , l* |9 V( O. }& l/ `
  11.     -- 遍历每个字符,检查是否合法
    5 ^3 i, Z  @# r6 O- o
  12.     WHILE @i <= LEN(@character_name)( H2 t9 p( Z: b5 ]
  13.     BEGIN
    0 j1 X! a4 H. t4 w" f5 P
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    3 t* X$ n, c$ w' J: |
  15.         & R" T; t# B$ o
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号- o' j. f! d: q1 U6 D7 `, L, U  l
  17.         IF NOT (& O! ]! N* e$ ^
  18.             -- 中文字符范围 (基本多文种平面)
    ; C; C; Y+ L0 T8 I
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    . ]( A& n* {% f! o/ o, C
  20.             -- 英文字母和数字
      Q( B, \4 `8 A2 V5 I  Y0 V5 ~
  21.             @char LIKE '[a-zA-Z0-9]' OR
    8 u! t1 M& C# u8 m6 a
  22.             -- 允许的特殊符号: p' \" S. V8 Z5 ^, t5 w7 D
  23.             @char LIKE '[_ -]'
    8 ~- l- s( K3 w, s
  24.         )
    + G! `' a9 v! {
  25.         BEGIN# n+ r% L0 T$ q9 b
  26.             SET @result = 1;: l' W! U/ _8 r* ~  d9 ^
  27.             BREAK;+ s/ j/ h+ U" U( T/ h
  28.         END& C7 }+ |: v8 r( _# r* L
  29.         
    6 T. S& }: T+ x4 I8 w8 P. |
  30.         SET @i = @i + 1;1 U9 R5 T" p3 _1 T0 R; x
  31.     END;
    8 [" m2 K% E# |
  32.    
    + t( A0 Q/ c! ?+ W- l$ [
  33.     -- 检查是否在非法名称列表中! l& y) C4 p) ^7 x! R. p5 F8 Q1 _
  34.     IF EXISTS (1 W. ]" {' Y. z2 T
  35.         SELECT 1 5 h: H9 |! U) y7 m4 _
  36.         FROM dbo.illegal_character_names ! N( I6 H( Q  G& y# U
  37.         WHERE @character_name LIKE '%' + partial_name + '%'; D+ g! k3 z7 U2 J
  38.     )
    2 C$ [& G: P, x& e: L% v( ?; s2 a
  39.         SET @result = 1;
    ; p; y4 p' z' b
  40.     0 t. b6 U& g: I( w
  41.     RETURN @result;
    / c5 K1 o2 z; ]- S: q! ^8 Z
  42. END</span>$ i2 [& K) Y- _9 Y
复制代码
插入屏蔽的字符
/ q# A# c& H( j% c1 C5 B
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    3 l: R. }) V# \6 u' s
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    2 m4 m# a  j& H) M
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    / h* k8 E  ^$ d+ N) s) m/ C+ |
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    6 H0 J  @% t+ R. D
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');7 Q8 F/ i' w, K4 m2 V9 z! c0 O

  6. 0 E4 l- {8 z5 D+ R5 B0 |- t
  7. -- 示例:查询包含敏感词的角色名& n" k% E; k! D* Q
  8. SELECT *
    : R5 C% @* H  q  k$ D5 E0 d
  9. FROM dbo.characters 4 r! A1 |5 I4 H, Q5 m1 v
  10. WHERE EXISTS (
    0 \4 G, w9 A2 K% X6 q: \
  11.     SELECT 1 7 B9 x8 k' h' u7 m+ m
  12.     FROM dbo.illegal_character_names
    4 B& h# \, c9 c) W; X1 s' B1 h6 c
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'6 k/ ]7 Y, s8 H2 q; S1 v
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
9 A# t  {& R6 v% U; Y% \" ~6 \原始为:
0 G, A  m( N% H( _- D. y6 k
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    ! Z: E$ K- l  h! i8 q8 Z' q: E

  2. 1 u- o( d2 U5 m8 G/ Q
  3. IF @v_ret < 0 5 J" i# d1 T6 y) m9 i
  4. BEGIN6 }0 G5 t8 O: i0 {6 T0 p8 Q) V9 t
  5. SET @sp_rtn = @v_ret
    ( a. A0 P- G* C+ ^, b1 o
  6. RETURN
    0 i5 z" \3 e& M, R
  7. END
复制代码
修改为:
% m' a$ h3 O) {5 M5 B
  1. IF (dbo.NameBlock(@character_name) = 1)) c+ z+ E" p- n& O
  2. BEGIN
    : @* K8 Q) ?( z+ B+ S8 a9 x' A
  3. SET @sp_rtn = -12
    , u7 f8 ^& L. c& m
  4. RETURN
    3 u& N, T* d5 }/ i, y) R* D# h- y
  5. END
复制代码
7 A: @+ s$ B/ j4 ~
4 y& X- r+ t* P1 L% x
" t- u3 T( ]! y: ~/ w5 o8 z. B' W
+ g" f5 F) f) A# v; D# p) S+ M$ T
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-5-13 22:58 , Processed in 0.034822 second(s), 26 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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