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

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

[复制链接]

150

主题

310

回帖

5316

积分

管理员

积分
5316
金钱
1706
贡献
3150
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表* O3 R7 W; ~% N7 X# p9 a
6 d/ [7 o% _5 z) e& ~' @* _4 {
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数* _8 K9 l: v) i! s: t$ T* w8 |
  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 (* v; b; P( G$ ]1 ?: g
  2.     @character_name NVARCHAR(40)4 x2 I* w2 x- n2 J8 M2 B6 H) z# m" z
  3. )
    , U% ~0 w- H6 Y' y) d
  4. RETURNS TINYINT8 e9 k' ], C+ S
  5. AS4 c2 D+ C8 c% m( }3 t- D1 U7 g+ P
  6. BEGIN8 s+ n$ i2 R+ w. K% n
  7.     DECLARE @result TINYINT = 0;! \" x6 }4 s. @/ Z3 r# A; E
  8.     DECLARE @char NVARCHAR(1);
    6 z1 X( d( m/ Y' f/ b8 }% C
  9.     DECLARE @i INT = 1;
    # [; @$ h& Q& g+ V
  10.     " K0 U' p- O/ W" x
  11.     -- 遍历每个字符,检查是否合法0 f5 B1 `9 M, ]
  12.     WHILE @i <= LEN(@character_name)
    $ n, t9 F7 H7 ]6 d7 B1 G+ s
  13.     BEGIN
    + `/ w% f# [/ [  b
  14.         SET @char = SUBSTRING(@character_name, @i, 1);! `6 f+ ?# B5 |3 z+ o
  15.         2 {3 F, B5 ]5 c( A3 n) i$ d
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    , |; o& G; A3 j8 c
  17.         IF NOT (( e' V" f4 }% A5 [" W1 T6 V
  18.             -- 中文字符范围 (基本多文种平面)
    0 `9 L. ^- W* \7 u* u+ g
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    4 Y- Q+ v* p. }  b
  20.             -- 英文字母和数字
    5 M% q2 H( _" H3 P
  21.             @char LIKE '[a-zA-Z0-9]' OR
    ( F2 Y9 c# D2 b: f
  22.             -- 允许的特殊符号6 r+ B" l7 r; U
  23.             @char LIKE '[_ -]'
    / ]# b& ]# `; w) r% N) x4 G+ s. ^+ t
  24.         )5 ^: N4 \  i6 k. ^( w$ D+ E
  25.         BEGIN
    : K' z5 O0 L6 I1 Z
  26.             SET @result = 1;1 v0 g3 r0 v, u4 t
  27.             BREAK;
    : S8 N) J7 D/ |6 y7 M
  28.         END' a: n! x* X" H* V2 S
  29.         " ~" `. c, ]0 I8 F
  30.         SET @i = @i + 1;# s$ S# s9 S& J8 B: T7 m% ~
  31.     END;
      Z% v' |, w# b( _% f0 ~$ x1 M
  32.    
    - b; H1 n; b! Y+ I0 ?6 e
  33.     -- 检查是否在非法名称列表中4 A9 w: d9 d$ O% K& g8 @3 a5 m
  34.     IF EXISTS (/ H& W. W6 O; v3 X" x- J9 b4 n. H
  35.         SELECT 1
    % Q% U; m# a7 M
  36.         FROM dbo.illegal_character_names
    , t0 g" S' B( M8 Z4 j$ D
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
      w0 E  ^5 d9 B- H, k: s
  38.     )6 \! ?+ p" l( c8 A% p; ]1 [$ A/ }6 F
  39.         SET @result = 1;
    4 z/ X$ F# |+ ^( V* j: P0 H. S# W
  40.     8 h0 p; a+ G% G5 P8 {+ J; k/ O
  41.     RETURN @result;
      r& B& K; V* R
  42. END</span>
    ' y. o2 o. J; g8 `3 _2 I  t! x2 L
复制代码
插入屏蔽的字符
5 b: s: j9 ?  [0 a
  1. -- 插入非法名称列表(明确列名并使用N前缀)$ E0 b$ }  ]/ T2 z% }5 }
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');, `  q; m. e' u# n) V1 X
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');4 [, M; s; o  `8 \% V
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');  W5 v: T1 H% ]1 v* m/ ?' @1 S! t
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');; x9 o$ ?! J1 b( _& O5 ]+ \2 f

  6. 2 r+ J2 ^! ]1 r' t/ I
  7. -- 示例:查询包含敏感词的角色名
    1 x2 J" A. O- u2 ~! O+ h
  8. SELECT * # |, U6 Z# S" O
  9. FROM dbo.characters
    1 D; e$ o, s; T- j6 s
  10. WHERE EXISTS (, S9 {: o) X7 b' A3 a( @& ~2 ?6 Z
  11.     SELECT 1 - d. R: U9 I5 P, @0 |2 c" j
  12.     FROM dbo.illegal_character_names
    " v; c% s2 N9 Y9 d
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    4 u* e; I4 f; J$ b: P: V0 I! E8 c
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据. y  h# ]6 w( p% `8 |- F/ z* j4 P
原始为:( t5 A, j% a; H9 Y$ d5 d
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT& ?! J  N# q) o+ s$ I- x* t4 {; O* q
  2. 3 X5 m( S: Z) W( f% X  G
  3. IF @v_ret < 0 ; I* l6 a" B' L3 L/ \1 [
  4. BEGIN& O; n$ y. o3 k
  5. SET @sp_rtn = @v_ret
    & l/ D' K: _, H# @$ U8 S
  6. RETURN
    5 ^7 o, B0 S$ b" U
  7. END
复制代码
修改为:
6 t( v* y! _# [
  1. IF (dbo.NameBlock(@character_name) = 1)5 R. |; O' G, p# V4 F8 k2 E2 ?
  2. BEGIN, ]$ ?$ U$ b6 [) x/ {
  3. SET @sp_rtn = -124 N3 B8 N  i# ?9 `9 _* k
  4. RETURN+ c6 Y7 i3 j4 s% d- D+ I, M0 K
  5. END
复制代码

' z% Q- J% Z% Z( q. `1 V7 t
4 t5 Y4 O# w0 T% G4 N0 O
; v5 u; Q* J- I$ N3 n

: I8 [) }( n3 J
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2025-10-10 12:36 , Processed in 0.265160 second(s), 26 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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