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

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

[复制链接]

153

主题

334

回帖

5703

积分

管理员

积分
5703
金钱
1800
贡献
3416
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表! J, i# c# j0 e: h2 k/ K! H" f
* V" r* T* S7 k% n# g7 i
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数3 L; Q1 C" K/ P5 i, x3 O6 o! S# h" {6 Z( I
  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 (
    ! |" x/ i$ @) m& O
  2.     @character_name NVARCHAR(40)
    % P+ U# P0 a8 D. F, d
  3. )
    * u! ^1 C6 X4 s- p" O1 S& e
  4. RETURNS TINYINT
    : A" w7 y5 w; R: d$ k# @& b
  5. AS
    ' U% |8 f9 I/ b# k( @+ a0 a
  6. BEGIN$ ~6 j. Q* [1 r( X) b
  7.     DECLARE @result TINYINT = 0;
    7 ]" j' R- w& i( o( u! v5 z
  8.     DECLARE @char NVARCHAR(1);6 ^4 i) G5 K6 ~- \! e4 ^% {
  9.     DECLARE @i INT = 1;& |! q% }- Y9 F3 t' {
  10.    
    ( G3 ^0 Y; z# \" A) P
  11.     -- 遍历每个字符,检查是否合法
    & N! R1 _. C4 R  O! [, t, W
  12.     WHILE @i <= LEN(@character_name)
    * D& \  w' B& w! I
  13.     BEGIN3 K0 `! d! |! D# [/ c% V
  14.         SET @char = SUBSTRING(@character_name, @i, 1);; Z. V1 H5 S" W4 A/ Q
  15.         9 i/ j; h: ?9 N5 p  X
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号( l0 G7 l# S. I1 i1 c- o
  17.         IF NOT () N. A' L% M- [7 x5 P
  18.             -- 中文字符范围 (基本多文种平面)
      S9 ~5 w! z2 b& v3 w% {% R" w/ \6 P
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR- ^2 g4 ?' s/ ?6 T. c( n, A
  20.             -- 英文字母和数字8 l" k* l# m1 ^7 M( o+ }5 W
  21.             @char LIKE '[a-zA-Z0-9]' OR* M, G0 E8 N( }: S, y) s" P
  22.             -- 允许的特殊符号
    ! A7 Z5 Q+ j9 s2 @2 w$ S4 e
  23.             @char LIKE '[_ -]'% `/ W- Z. b7 `9 N* Y1 x. T
  24.         )
    9 d% X) D# s. f* g+ W
  25.         BEGIN
    - h( z* Z4 s( ^2 }8 |$ s1 G9 M' [
  26.             SET @result = 1;% v; P: W# ~9 u) j! g' x
  27.             BREAK;) {2 C3 X) d# k% b
  28.         END
    " C6 O+ F1 S: k  s% ]
  29.         # m8 r6 c, i% X6 |
  30.         SET @i = @i + 1;
    $ h$ Z+ W/ R7 n$ \, l' V; ~' |
  31.     END;
    ) p* ~+ y+ M2 h1 K& f' @9 X# P2 U
  32.    
    . z6 Y9 G% m" o# _
  33.     -- 检查是否在非法名称列表中
    6 K# h* {' ?! f6 b7 a! r" q
  34.     IF EXISTS (
    " h. U" v, ~' W
  35.         SELECT 1
    + F7 m: L! `2 r1 M3 D
  36.         FROM dbo.illegal_character_names
    ; G) l/ H* U3 d8 A# L
  37.         WHERE @character_name LIKE '%' + partial_name + '%'( _+ m, H5 @  D; c- N5 m
  38.     )
    / \2 M3 _. p+ Z! u0 R6 W7 h5 A3 {
  39.         SET @result = 1;2 t) ]: t0 [1 b5 V5 z
  40.    
    0 Y9 S/ d8 m2 D0 `2 x& \
  41.     RETURN @result;% k4 F. ?- K9 u; \* H& G5 V
  42. END</span>
    3 L+ V/ l5 m9 E' @( x, H
复制代码
插入屏蔽的字符
+ }* D$ w$ G; x# ?- S
  1. -- 插入非法名称列表(明确列名并使用N前缀), W3 b+ J! Z( {+ z
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');0 g) C) F# C$ G  C( V& I2 U
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');9 P& U5 T% {$ E5 K2 r
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');+ p6 V7 L* K- u' [
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    & [9 L2 u( ]8 a+ S0 t: o, u

  6. * v0 t% B# X+ [
  7. -- 示例:查询包含敏感词的角色名
    1 E+ N! g( E' y, G  k
  8. SELECT *
    % ~" X# I# J' K: ]
  9. FROM dbo.characters ( }, A9 s% m; b" {; e
  10. WHERE EXISTS (+ J3 q9 l! X' A) R4 b; L  @
  11.     SELECT 1
    3 {, j+ G7 z4 p2 C1 e' C" C* F
  12.     FROM dbo.illegal_character_names
    - W. H, E5 u5 A8 [9 X4 ?# n
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    & G! N2 t2 Z( k. J" _% v( M* l6 p
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
/ ]! @0 g$ o* E, }4 ^) d原始为:
# {8 T) C/ T1 K2 Z- F8 h5 M$ N
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT& ~9 g2 O: D0 u6 Z
  2. ( g% Y; @5 j& h+ j! W' J1 O
  3. IF @v_ret < 0
    4 w2 [$ B1 U+ w! R
  4. BEGIN
    % c4 ?6 ^+ d+ G" E: m1 t
  5. SET @sp_rtn = @v_ret0 X+ ?' U, E! F6 ]' z
  6. RETURN* t# c1 {/ o8 L+ I
  7. END
复制代码
修改为:
5 ^: J/ a. d0 v/ r8 X) {) p1 W
  1. IF (dbo.NameBlock(@character_name) = 1)
    4 _9 ?4 P+ S, O% y& h
  2. BEGIN
    ; V, ?  f- t- w9 h" E/ |) j
  3. SET @sp_rtn = -12$ X: P+ t% a4 l* P) J+ D
  4. RETURN
    + X+ X) y! F. v4 Z% x4 ?" e6 C
  5. END
复制代码
$ [2 H0 A! H6 T* u, t. @$ C5 a

+ e6 q5 h' Y! _5 A" Y) j
! _, D8 K! D& L3 X* i$ {8 Y  G; z* z; {

1 m* p9 ?* K# o1 k1 f, I
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2025-11-21 12:03 , Processed in 0.055725 second(s), 26 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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