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

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

[复制链接]

153

主题

333

回帖

5695

积分

管理员

积分
5695
金钱
1795
贡献
3414
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
1 L  w& |. I7 P8 h9 d$ O4 B4 O* H4 E
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数' K. P% y( y, C3 o, G  K) V% ]- @
  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 (7 H" U& y$ p# Q  |8 Z% A
  2.     @character_name NVARCHAR(40)9 }; e: R0 p5 j+ m3 \2 [
  3. ), m$ C# g& w% {( o  t9 j
  4. RETURNS TINYINT
    % q: ~3 z0 Q2 u* p" e, x8 ]( ]' t
  5. AS
    2 a% s! N1 ?( b1 r7 {! {
  6. BEGIN$ g1 L7 _/ q6 @' [) K5 d# c0 `
  7.     DECLARE @result TINYINT = 0;$ o+ D( u7 \8 ?) ?! N4 k
  8.     DECLARE @char NVARCHAR(1);
    5 L2 X$ h3 z: L* _
  9.     DECLARE @i INT = 1;0 m: X. q, Q; C+ N* x! h  f
  10.    
    ! A' f1 ~+ v5 w0 i- C
  11.     -- 遍历每个字符,检查是否合法/ X. [. u! X+ {0 g/ s) @% [6 q+ r
  12.     WHILE @i <= LEN(@character_name)$ Z* e( W, j2 B- ?
  13.     BEGIN6 n  P& A) e6 U4 r
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    ' B" y; o, A+ x6 r4 m
  15.         8 y2 @$ Q7 T% I* A$ M
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    ; G- x0 Q  k" C% o& n1 W9 s) k
  17.         IF NOT (
    # Y& i3 _, X! ?2 e
  18.             -- 中文字符范围 (基本多文种平面)- Y% O- t8 v$ z' A) {  l
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    % Z' ^2 b$ T( ?9 N
  20.             -- 英文字母和数字1 f& j5 q: Y2 O
  21.             @char LIKE '[a-zA-Z0-9]' OR
    ! L! a7 B5 A( w+ A$ a$ H( @
  22.             -- 允许的特殊符号
    - T. ]& A* ]1 y# C
  23.             @char LIKE '[_ -]'7 n* s3 t3 H5 Z* S
  24.         )
    , W; O9 D, t, u5 y+ R' z
  25.         BEGIN
      X) E, w4 `  a& u$ S: L
  26.             SET @result = 1;
    5 N0 N; F$ [3 u4 l4 e4 v
  27.             BREAK;
    / w. ]2 Q. V. V( {/ ~2 V$ ~* ]! |
  28.         END  Q; g* T/ j* g! p) k
  29.         " w! N% r1 v1 V; h
  30.         SET @i = @i + 1;& J% U) O6 m/ s4 X$ a9 _
  31.     END;+ \* k, ~4 N$ O
  32.    
    . r; v6 c2 z' E, @1 \# E4 J
  33.     -- 检查是否在非法名称列表中
    $ {# a$ [- Z- x7 Z3 o
  34.     IF EXISTS (
    $ \+ x1 A3 T* z  s1 Z
  35.         SELECT 1 & `- I- p  h5 W* q2 r' ]9 E
  36.         FROM dbo.illegal_character_names & ^+ I' k5 w3 z# {1 n8 @3 m
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    ! ^3 i# H5 a" `6 A
  38.     )9 V, n1 z' G, V1 M: G, [- q. L
  39.         SET @result = 1;
    ! y4 K# u" f: R' d
  40.     0 A/ }0 K" w  A9 d
  41.     RETURN @result;2 X, q9 r4 n- h; {+ h! `( K
  42. END</span>
      P5 @, p' }+ Z7 j, I1 F
复制代码
插入屏蔽的字符
" f! b. f) O5 u6 o- }4 H. A
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    6 ?$ i+ T% C& J( F
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    7 X  G% _+ R1 D, {; y& y4 G
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');. H* F- l: m+ ]# Q8 l  g9 R
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    : y! t# k# H( Q/ D
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');& {! _$ ^  J2 a4 r* s2 n7 l
  6.   |/ f. o* A" D1 ]: \; h
  7. -- 示例:查询包含敏感词的角色名
    ' Z! C7 }, u% E
  8. SELECT *
    8 z" q# [! U( s0 O
  9. FROM dbo.characters " W& J0 p4 G4 E% f9 i
  10. WHERE EXISTS (
    ) Q5 t* E* v9 g0 o+ V8 O$ E
  11.     SELECT 1 # _' F6 R" @0 w5 m4 `8 c
  12.     FROM dbo.illegal_character_names . Z' w  h+ D' ]2 C5 m7 x
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    # l* A9 U; ]2 r* ~
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据! M$ D% ^3 Q. c; o  u
原始为:) \  P$ F7 c$ a/ g, Z
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    3 `- K* k3 f# L

  2. + `; E9 G/ V% J4 a- U" Q
  3. IF @v_ret < 0
    : k7 i7 N9 `5 ]+ d2 j# P; t
  4. BEGIN" V% i2 O. d) p# T8 z8 Y
  5. SET @sp_rtn = @v_ret
    + t& y% _0 Y: S. a/ X3 k7 \+ T) [6 V
  6. RETURN# {5 ?3 C9 d) K1 m  K9 V
  7. END
复制代码
修改为:
$ C# d3 J$ k) P& J% L
  1. IF (dbo.NameBlock(@character_name) = 1)
    ( Q7 ?$ F  o( P4 [8 s
  2. BEGIN
    & z5 p. V. R( F0 w# `  ]
  3. SET @sp_rtn = -12
    ( S) e# H4 i' p; i6 G* h
  4. RETURN
    3 O9 x9 S% L; e# e
  5. END
复制代码
$ \& U( h. @5 V# d9 w# P
- Y0 q* R: l2 d3 O0 {

  W* K  X! s$ h5 F0 o
4 T0 Q1 j0 r, e& u' I
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2025-11-17 21:03 , Processed in 0.055715 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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