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

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

[复制链接]

139

主题

236

回帖

4114

积分

管理员

积分
4114
金钱
1476
贡献
2263
注册时间
2023-11-3
QQ
发表于 3 天前 | 显示全部楼层 |阅读模式
建立新的限制表' f0 t4 y/ a1 k$ o) G

! ~, ^; A' L0 ~8 l( Y. F
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
8 F, |: O3 C/ j. 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: a: X: g+ O, ^) a4 T5 o# a$ j
  2.     @character_name NVARCHAR(40)
    ; c( e  r) k4 D& q4 x
  3. )" g; R, z2 M* p# n7 d/ m, U
  4. RETURNS TINYINT
      Y) K( i) g3 t0 m% ?
  5. AS
    * B% V6 v$ W; o' |8 z5 t
  6. BEGIN/ c7 y, Z( K; q1 P7 }, G( V3 E
  7.     DECLARE @result TINYINT = 0;
    ' H7 e4 g6 T  Q; B
  8.     DECLARE @char NVARCHAR(1);
    4 F* b' h2 u2 W2 I9 |
  9.     DECLARE @i INT = 1;7 A/ f/ E" _! y! a8 g% D5 S' F8 B
  10.     3 J$ O3 i+ v+ u& F5 c+ r
  11.     -- 遍历每个字符,检查是否合法
    ; f7 D8 E* o5 Y& B6 C: {" }4 V
  12.     WHILE @i <= LEN(@character_name)8 x2 W# Z& E7 s7 T7 y
  13.     BEGIN
    $ P5 H6 K8 y( S( C6 T+ l& j) w
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    ' H( |" V; ^# q& C  j* V1 W( A& _3 g
  15.         
    ) A+ v. M- r0 s& E( S* P
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号5 T/ n# @, V+ Z. d) v0 G
  17.         IF NOT (
    ( x2 G$ p8 `$ t# K8 H
  18.             -- 中文字符范围 (基本多文种平面)
      {. d: T) B5 _
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR) H7 U1 }, H; q* |* b" l% p
  20.             -- 英文字母和数字# d; ~) d8 z( X8 M% o
  21.             @char LIKE '[a-zA-Z0-9]' OR
    / x% J7 I+ R3 K4 G: a! w
  22.             -- 允许的特殊符号
    ! X6 _1 _; U% _" W9 Q: b' u7 W
  23.             @char LIKE '[_ -]'+ }7 x+ J. l  b$ c
  24.         )/ l9 i; O6 Q0 b. p- [
  25.         BEGIN2 L2 p# g1 M( U. p" u( @
  26.             SET @result = 1;$ E2 H& `9 k# ?: `+ f# F
  27.             BREAK;' D( m# T2 }! ?( y! F9 t( N7 L
  28.         END: \% ]# ^9 d' u) p. q8 [
  29.         * Q0 C" m6 E. s: ~% J
  30.         SET @i = @i + 1;, H2 u3 p+ o3 O) Y8 y: O
  31.     END;% }" \* G: j) ]2 k0 s
  32.    
    : v# d) u7 A! T. b0 E
  33.     -- 检查是否在非法名称列表中
    : _2 P/ N/ @2 X! [( F9 Q/ `
  34.     IF EXISTS (% A7 s" O4 N8 i4 X
  35.         SELECT 1 $ }' g9 b0 M: g' F' q6 ?; @
  36.         FROM dbo.illegal_character_names
    + Y: N0 |9 W$ i  C: l. Y
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    - J- L( J; s3 k8 y7 s- K
  38.     )6 U: e$ C1 R3 C  R6 R3 x
  39.         SET @result = 1;
    4 C; p8 Y/ I+ @
  40.    
      b% H% {# _: m9 r; ~! a6 ]2 h% k" |
  41.     RETURN @result;( m9 l6 x  N/ j5 U. L* u' ?
  42. END</span>- @" H# `. [- e# N! B
复制代码
插入屏蔽的字符4 J5 H* k6 @" ?
  1. -- 插入非法名称列表(明确列名并使用N前缀)/ y8 b3 F: `/ _/ e9 w8 H9 F" m
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    ) e( r6 {3 z8 z
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');$ r' p2 x/ A" l6 P+ H' g( z8 ~
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');: Q( P7 o4 p. O7 f. E
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');- ~, F# P2 u8 w- x, s  U  {2 S+ c
  6. ( r) n& D0 i$ x, t! h
  7. -- 示例:查询包含敏感词的角色名
    8 h/ A4 Z+ V5 A  I7 B
  8. SELECT * / s2 i& d; _! k3 O
  9. FROM dbo.characters
    % q* @, e$ D7 }0 u3 K
  10. WHERE EXISTS (9 j$ K  R" `1 w/ ^. j; Z( g6 K: \; u
  11.     SELECT 1 & O% G3 U/ b& F4 y  J
  12.     FROM dbo.illegal_character_names $ q0 X6 F) }9 r$ a4 K% F
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    $ D# I$ }, R! Z2 F
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
9 p# z% C' N; {! \' s& q! l原始为:( X3 {- L6 r% j; n; D
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT2 N, E0 X3 U5 ]3 O

  2. # n& P1 X4 I' I" I% ~  ?; t
  3. IF @v_ret < 0 + n: X4 {1 _' C3 w7 {& Q9 Q
  4. BEGIN! G; ~; C" B* ^- X1 h% z
  5. SET @sp_rtn = @v_ret
    / y8 z; F7 R) c8 [( X9 s8 R( m& Y
  6. RETURN6 I# ?6 A9 @# R" e
  7. END
复制代码
修改为:
7 k7 x. _/ Y2 {  e: j3 h) x
  1. IF (dbo.NameBlock(@character_name) = 1)
      K, Y" J5 I& R! r3 _7 U  Y, C
  2. BEGIN
    # d6 x, ^" m% D& t
  3. SET @sp_rtn = -12
    , ?3 F2 h; ~; U; y/ V) k
  4. RETURN
    ; s. l4 P' I" R: h
  5. END
复制代码

- l' U, t" W/ @' w8 ~0 }! t) m& m1 M, n4 u, g/ m: U9 N$ s

0 |* e2 Y" m6 M8 a1 c
) [8 ]  N8 x/ v+ l% ?2 z) `( e
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|EGameol

GMT+8, 2025-6-9 01:39 , Processed in 0.042973 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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