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

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

[复制链接]

151

主题

321

回帖

5508

积分

管理员

积分
5508
金钱
1753
贡献
3283
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
5 w( }! g% d7 D# ]9 V! H+ k
  S- o# J! K9 R; z/ Q* T
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
' `5 K; D9 y3 ^' w( \
  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 () p; r& g4 Y& l6 O
  2.     @character_name NVARCHAR(40)
    ( i' ^1 Y3 n: [, W6 z5 r
  3. )6 W6 a! A: M; H) g
  4. RETURNS TINYINT
    ; b- V6 t7 ^7 c6 s/ G2 f8 o
  5. AS1 B& S' y8 a& q' ~' E3 |. [* B1 x
  6. BEGIN
    ( F! e0 G* }" J$ X5 R5 C( f
  7.     DECLARE @result TINYINT = 0;
    & g! y0 I0 @6 E/ h+ x
  8.     DECLARE @char NVARCHAR(1);
    6 W+ j" K0 G7 }: i) F1 w" c2 h  t
  9.     DECLARE @i INT = 1;
    1 k; @4 |' @" I8 l) b, S/ S
  10.     2 d2 b. r5 R9 ^3 T( r+ ]3 [7 s  r3 K0 a
  11.     -- 遍历每个字符,检查是否合法6 D1 ]9 k3 t/ n7 x5 U7 `$ Z
  12.     WHILE @i <= LEN(@character_name)+ \7 @0 o0 u6 r# j% B% E; S' ]
  13.     BEGIN3 n$ j4 ?3 |* Z$ c; ]
  14.         SET @char = SUBSTRING(@character_name, @i, 1);, y. l) J; q+ Y9 p9 X9 D2 ^: B2 P
  15.         9 |& K5 z9 C/ p; \0 O
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    , q: j  B( Y: Q+ }
  17.         IF NOT (9 W" ~! G: r* P7 w/ F0 S& Y6 t1 b
  18.             -- 中文字符范围 (基本多文种平面)
    : P1 t2 z3 D- x" C! T% d/ h% a
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR+ @+ t! n. O. x% I  ^. ?
  20.             -- 英文字母和数字
    3 h  ~' B+ i0 S+ n% a
  21.             @char LIKE '[a-zA-Z0-9]' OR
    : ]7 K  o; |: h% Y6 ?
  22.             -- 允许的特殊符号
    + r' s, @) N' z$ ~, c2 q
  23.             @char LIKE '[_ -]'% j, l3 @; N1 o' S# V# J
  24.         )
    4 J' ?8 ?3 t, u! L+ J
  25.         BEGIN
      [: y. M: V" a1 v1 Y: v5 l
  26.             SET @result = 1;
    ' W2 ?  J( o# s4 v$ |" r4 |4 M
  27.             BREAK;8 G. ?+ u3 E+ S# r( H
  28.         END3 a. \" n, [2 x1 B3 J
  29.         & N! ]0 \1 O  Z, Q  c' J
  30.         SET @i = @i + 1;' [: l  S& }4 M& x/ O
  31.     END;2 J6 m) O) Q/ n' O0 r& N- z
  32.     - f: @. I+ Z5 v5 A: H
  33.     -- 检查是否在非法名称列表中. T# |; J% ]6 q5 W! U' q& C  o# l* w" _
  34.     IF EXISTS (
    : P1 w! a% U* q! Z/ B  \5 ~! k
  35.         SELECT 1 0 H+ J2 e/ a8 Y1 _
  36.         FROM dbo.illegal_character_names
    9 E" y" f; g( C4 b9 N2 _
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    " Q) R9 F- h. n
  38.     )1 q( P5 _! K8 T1 o" o" C' @
  39.         SET @result = 1;" q( }* F' R* h  q9 S
  40.     - p- M8 w& g$ F- A' D
  41.     RETURN @result;3 y+ \' M! I3 v  X- a7 a/ ?
  42. END</span>
    9 r; U% R3 B: i. Y
复制代码
插入屏蔽的字符
. Z& |3 Z" S! T7 E- B* |
  1. -- 插入非法名称列表(明确列名并使用N前缀)6 \. F2 r! j" m: B, E
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    8 V% P2 V) O2 ~9 V4 V$ \. k( y, |1 ^
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    + ~: F4 C' U& n5 J& u; ^5 m
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');3 X; o+ w% A% K* ]* u6 C7 X( K" z
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    3 D1 ?/ B! G4 b2 \

  6. 3 d$ K  L8 }/ l1 s7 d! p
  7. -- 示例:查询包含敏感词的角色名6 n2 Z5 t  {3 X9 Y( g9 i
  8. SELECT *
    + \0 D9 _$ k2 l8 h
  9. FROM dbo.characters
    & P; O9 i, z! R5 r. L$ U, y
  10. WHERE EXISTS (
    & o0 E9 J9 k6 s7 x
  11.     SELECT 1 ' ]: P: d3 H; v/ o
  12.     FROM dbo.illegal_character_names 9 ?4 L% h8 {0 H( W" C) A
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    1 T. X, u4 R# E7 A
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
: {1 u+ G  p7 X1 ^, k! H原始为:
* L6 M3 F% n; ]
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    * K6 ]( }% Y& u. s5 P# i

  2. 1 v% Q- o6 w* Q& {& A
  3. IF @v_ret < 0
    2 ~7 j# c7 r6 ^: t( j9 G
  4. BEGIN
    $ B/ e' \7 w" r
  5. SET @sp_rtn = @v_ret0 a* k) n* B5 I
  6. RETURN" U6 y7 g! U) z' x/ t* T( \& e
  7. END
复制代码
修改为:9 V  N) x) i( W2 Z3 i
  1. IF (dbo.NameBlock(@character_name) = 1)8 @' f( R+ y2 O/ c) M( Q
  2. BEGIN
    + j6 U! o4 p$ U7 K# r- W
  3. SET @sp_rtn = -122 B3 F+ w1 a" @4 J: D. K3 |
  4. RETURN
    1 k/ o4 ~" O: h" K
  5. END
复制代码

  m/ c1 R5 n1 N( |0 S* x  r1 P4 l( b& }  h3 `# I  `& o+ g" g( M
2 j; Z3 K$ T; t7 N- Q# A0 \, {

( p6 G  {4 i- `
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2025-10-27 11:36 , Processed in 0.057413 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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