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

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

[复制链接]

166

主题

423

回帖

8040

积分

管理员

积分
8040
金钱
2357
贡献
5094
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表" D& B' n3 G  K
( @6 x5 f9 P$ e: |! f
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数3 O8 q# F7 g4 b- f, C# F. E# u! B) b: T8 i8 j
  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 (
    ' Q& x' U8 S( X1 I
  2.     @character_name NVARCHAR(40)9 @! p  b; q# c+ @5 M) t' L7 t
  3. ): l8 Y+ E9 U5 j" _: {
  4. RETURNS TINYINT
    * `; m) _! a9 p' H9 ^/ F0 P* w
  5. AS# r; v( O" l; Q0 f
  6. BEGIN) C7 \1 y) Y) d+ Y, i4 c, x
  7.     DECLARE @result TINYINT = 0;
    8 y" o3 @4 V1 a
  8.     DECLARE @char NVARCHAR(1);
      S$ Z/ T- n: e& O
  9.     DECLARE @i INT = 1;2 F: U% M, j: T: p$ k, ^
  10.    
    3 A+ `( F! @3 ]: W
  11.     -- 遍历每个字符,检查是否合法
    & |6 Q+ s5 v. h( T! j
  12.     WHILE @i <= LEN(@character_name). c: }" L8 k5 }9 {
  13.     BEGIN1 }$ a  T; f, e4 u3 x( I
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    2 S/ n8 w) N+ t: s! Z6 \
  15.         
    4 C) u: o7 R$ w5 H8 f' S
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    0 Y6 V4 ^1 z0 r
  17.         IF NOT (
    , ]4 O( X" O, S% |9 A
  18.             -- 中文字符范围 (基本多文种平面)
    7 P" E4 }8 _' o8 Z4 Y
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    % G/ f( g2 M) t$ w9 U$ L
  20.             -- 英文字母和数字
    ( i# U6 x# @: j9 Q( J
  21.             @char LIKE '[a-zA-Z0-9]' OR
    2 X5 R" p# L* B4 Z5 U: f- r
  22.             -- 允许的特殊符号9 u) j0 K! z; D5 Y
  23.             @char LIKE '[_ -]', _7 a0 w  Y# p0 p
  24.         )+ `; q6 O" K8 P5 h- ?' ]5 L
  25.         BEGIN
    ; k/ j8 n6 M2 k, Q( Q
  26.             SET @result = 1;" }6 H- H  {0 c! v6 x# e
  27.             BREAK;6 @( O* x9 y6 x9 c, x8 x4 S
  28.         END9 P. ^' x# O- I7 B
  29.         3 D. n+ U3 N( \2 b# s: ?; o& R
  30.         SET @i = @i + 1;
    % M! n* B, ~# O6 \& e
  31.     END;
    ' x. F$ I4 u5 ~
  32.     7 X' @8 |, c, D6 X! t% `
  33.     -- 检查是否在非法名称列表中, I2 l0 u# [: C0 I: ]
  34.     IF EXISTS (
    & ?/ a4 e2 r" v) }  E7 f
  35.         SELECT 1 ) r4 e- u; ~, C- ^
  36.         FROM dbo.illegal_character_names $ g- ?/ b2 \, S' l1 u" J) T8 U& y
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    ; i, d9 H( M; H3 {$ [. }& `
  38.     )
    $ a2 F. q. |( z: c4 }
  39.         SET @result = 1;
    + a2 p( P/ Q8 d# d
  40.     . x9 V1 y$ ^8 V( h, q& S
  41.     RETURN @result;
    $ z6 m6 G) F. W9 q9 ]
  42. END</span>7 u5 o' V. f, J3 r& `) z$ J2 K) a
复制代码
插入屏蔽的字符
8 Z  a3 l! }/ {& Z
  1. -- 插入非法名称列表(明确列名并使用N前缀)( C) Z* d. x4 [* @  o
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');; r- p3 P: C1 c: `! z) x6 s% e
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    & x0 C6 o2 X/ q5 W
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    " J$ j2 j! R6 E( i8 O& R& p" i
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');3 G! C. r9 o. n

  6. . i3 j0 R. ]0 U/ Q
  7. -- 示例:查询包含敏感词的角色名
    5 C7 I. t; A* r
  8. SELECT *
    : D+ H- M' n. S, V  L
  9. FROM dbo.characters
    4 |: k$ o: [, k
  10. WHERE EXISTS (
    9 I. @( o: L9 A* ], O& T7 i
  11.     SELECT 1
    7 ?0 D' s: P, V. F; X% Q  O" o+ v
  12.     FROM dbo.illegal_character_names ! s' M+ \- p( O2 Z, {+ B
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    ; u. O$ V' H5 @
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据3 Z4 A# i1 M4 a/ C! X: ?) f
原始为:
! k# T( k+ a' c/ M
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    ( z( L. x* X3 m1 r! }, h+ l

  2. 4 B" l- u0 Z- ~4 B) U9 i0 M
  3. IF @v_ret < 0
    ' R% m7 r& X: @0 F& f6 L  S
  4. BEGIN
    7 q8 m: C% g! |7 I  v& r- J$ ~- T
  5. SET @sp_rtn = @v_ret. ^# |' Q' k1 W0 c4 K0 k
  6. RETURN1 b+ a8 h( c$ o% w; J% Y. R- q
  7. END
复制代码
修改为:% ]( d3 G& E" v2 n+ A
  1. IF (dbo.NameBlock(@character_name) = 1)3 f: k% w9 M) u4 l0 C0 O. Y
  2. BEGIN
    ) f7 r( Y# Z5 ]
  3. SET @sp_rtn = -126 a* L) H4 U6 B. w
  4. RETURN( j) T5 Q/ O: m6 ?/ o, n
  5. END
复制代码

* A+ o# Y% G" p/ M& `* b* x4 n. A0 }. N$ H/ C

! I" }* v1 U9 i6 C3 f) `
0 C0 Y/ S3 u3 l2 j; I4 P
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-9-9 08:19 , Processed in 0.053724 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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