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

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

[复制链接]

165

主题

418

回帖

7945

积分

管理员

积分
7945
金钱
2326
贡献
5036
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
; `. N' [5 X; K, F& \* E
/ ^0 G$ g2 P6 d/ j4 [
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
8 C  A0 ?! j0 T6 e0 u
  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 (
    8 y$ U, W3 d7 Q% K5 K% u( v$ D
  2.     @character_name NVARCHAR(40)5 ~7 N' U' H& ~* ~- n& K5 c, c
  3. )% Z$ x6 ~4 I3 |2 W1 H8 r  ^5 Q) x
  4. RETURNS TINYINT4 s6 f4 Z7 Q6 L; S8 D( H% G! o8 k
  5. AS
    * i& x/ F7 I. q% T' k
  6. BEGIN' B; Q6 I( o5 z/ f0 [4 _
  7.     DECLARE @result TINYINT = 0;
    . O* F1 J; r1 T, V) ^% q+ A2 Q: u  @
  8.     DECLARE @char NVARCHAR(1);7 A! g% Y/ l; i7 `
  9.     DECLARE @i INT = 1;: `6 j9 Z+ u; _1 w1 P
  10.    
    1 Y* {. c( H3 b, l! g
  11.     -- 遍历每个字符,检查是否合法
    5 o( x* m) S6 \; ?
  12.     WHILE @i <= LEN(@character_name)
    5 A: c% b0 a! E; w% D8 H3 n
  13.     BEGIN' h' V+ l6 q) a# I. t; z6 K0 F
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    5 N# |# w/ F  t; a. K
  15.         3 ], y( ]4 ]* n3 D; F: _2 D6 i
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    , l) f% k! o& U, S2 a' r
  17.         IF NOT (2 b6 X+ ^$ i/ H
  18.             -- 中文字符范围 (基本多文种平面)2 j7 m/ @. C5 x8 _$ B, D, j4 s! @
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR7 S$ N: X  E! j" t8 |8 x
  20.             -- 英文字母和数字9 o6 Z8 D* U% L5 a, @
  21.             @char LIKE '[a-zA-Z0-9]' OR6 v7 ?7 O9 X2 s
  22.             -- 允许的特殊符号
    0 A) ]5 ]3 m  g. Z
  23.             @char LIKE '[_ -]'
    4 ?0 w1 z" _9 H1 j2 ^
  24.         )+ v' G( f& \: ?0 I9 c7 @
  25.         BEGIN
    ( j" m  [0 K4 V3 Y( m& r
  26.             SET @result = 1;
    $ S* G: ]2 W% }
  27.             BREAK;
    3 X; j3 K2 _( A- h$ Z, x& O; W
  28.         END& Z3 h4 H( J* G
  29.         
    $ {: {9 ]  E( `; o- q
  30.         SET @i = @i + 1;
    ) D# |- v$ m% Z; c8 G7 g3 E
  31.     END;) s: a5 Z0 @# V' F( u
  32.    
    * B& I4 M* L5 p6 g* R9 N
  33.     -- 检查是否在非法名称列表中; P% V% A" H" h3 H
  34.     IF EXISTS (
    / l5 z4 ?+ Q$ _  _
  35.         SELECT 1 " R( h! m% Z, z5 y8 \0 E) Q
  36.         FROM dbo.illegal_character_names 0 |( L# n4 F# m
  37.         WHERE @character_name LIKE '%' + partial_name + '%'/ Z2 d5 ]9 i$ y+ r& ^
  38.     )3 |- D% ?5 t5 ^: Z+ z
  39.         SET @result = 1;5 r& d: A" h  |
  40.     5 b6 q$ N5 A1 \4 P, S3 E. `1 i+ q
  41.     RETURN @result;: q0 e: U, E" f4 ~+ l8 v, `
  42. END</span>$ `  B: v1 @- {0 z# }( l& ~
复制代码
插入屏蔽的字符
# r8 R+ |8 {. n+ O9 o
  1. -- 插入非法名称列表(明确列名并使用N前缀)% [# h' b& t3 G0 d1 o0 S
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    2 m+ `0 H1 q1 T% x0 a! Y
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    ; o! L; G# n6 U; x( c8 Y: {7 Q
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');
    , J0 j/ \; n/ x. W1 e2 z
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    8 k% |  R: E9 p# D; g
  6. 5 z/ f: v) f' O1 O* M* d5 A5 ?
  7. -- 示例:查询包含敏感词的角色名9 N2 G2 Q" E9 j
  8. SELECT * ; y4 R) r/ E/ |# F6 |* [  M- N
  9. FROM dbo.characters
    4 d& }$ n% l8 R  e9 Y
  10. WHERE EXISTS (
    % l6 E( I1 L# ~& A# u
  11.     SELECT 1 & T" S% R- T5 K6 z+ ]
  12.     FROM dbo.illegal_character_names   Q& m0 t4 ?) T) f
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%', `3 G. ^, Y9 O4 {  K  H
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
7 B, X1 H6 l0 t3 B原始为:
% o( u3 o2 V& z* V1 U& Q
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    6 l! B' g1 K8 W6 S  s- i! E
  2. 2 _) ^# p! ~$ S% w) A0 Y
  3. IF @v_ret < 0 + q3 ~5 Z' M% _, L' m- y, H0 k
  4. BEGIN/ b6 h2 {2 B* r2 }  ~: o5 _
  5. SET @sp_rtn = @v_ret0 J5 z( V: y* [8 _* g* d: i! z
  6. RETURN7 _! |% ?1 h: F5 P, D0 @
  7. END
复制代码
修改为:- T# b8 |1 d3 n3 w2 L
  1. IF (dbo.NameBlock(@character_name) = 1)0 Y6 \% M  n+ O" G' U
  2. BEGIN
    ( p. b1 q! x) N3 i) ]
  3. SET @sp_rtn = -12
    + O, e: T8 ?6 Q
  4. RETURN
    # |# P, ~/ M3 c! y
  5. END
复制代码

* e" b* o6 {) H$ T
- f; m+ R$ q: H1 u9 H! a
6 Q- |# E' {: ~& Q

' n; M2 ~* z0 d; u1 M  A
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-8-17 12:51 , Processed in 0.056548 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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