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

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

[复制链接]

157

主题

362

回帖

6843

积分

管理员

积分
6843
金钱
1944
贡献
4380
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
! h' z$ H' F% Q4 A0 Z- d4 B9 d5 ~2 q
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数: D6 d0 Q9 j9 j9 B* @! |: G0 M
  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 (
    2 ?" d" E, z  S1 M; H. ?
  2.     @character_name NVARCHAR(40)
    ) n4 o) B: ]0 g# c
  3. )
    5 r1 X) d' p9 F! M) i$ t. B. a
  4. RETURNS TINYINT
    $ I0 O  X8 [- e( \: q) H3 O
  5. AS1 A# M4 u+ W* p- q
  6. BEGIN
    0 z  b' X' i) [1 ^
  7.     DECLARE @result TINYINT = 0;
    ! K( g% q4 ^$ R4 C* ]
  8.     DECLARE @char NVARCHAR(1);
    & `% a: W! T. q( [$ m* Q  \& i
  9.     DECLARE @i INT = 1;
    . O& r& l/ T' W- D/ `- ^4 r
  10.     : Y4 G, t$ K  D* w
  11.     -- 遍历每个字符,检查是否合法) }0 t0 N3 K: C1 k1 z& r2 N  r
  12.     WHILE @i <= LEN(@character_name)
    # A* U' z1 P# @" E
  13.     BEGIN
    & n+ J1 d0 a/ D5 m/ B
  14.         SET @char = SUBSTRING(@character_name, @i, 1);1 R% i5 r/ U3 K" K
  15.         
    / T8 R" K* f% d
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号
    * h# Z1 D0 @) _
  17.         IF NOT (
    7 w( Q: ~3 T( d& H' n/ X
  18.             -- 中文字符范围 (基本多文种平面)
    ' @5 _( @& I2 h
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR) {. c7 p9 Z) Y' C% d) _- s
  20.             -- 英文字母和数字
    * H1 Y& d' j% C4 }/ [$ H
  21.             @char LIKE '[a-zA-Z0-9]' OR* C! K; j) p9 v. O- ]; j4 T! t
  22.             -- 允许的特殊符号7 R- b: q& j* k' B1 c5 a% s
  23.             @char LIKE '[_ -]'
    / k, w$ S1 f0 _6 ~
  24.         )  D: ]3 V) d5 n& v- `
  25.         BEGIN; g3 o( b! i- k/ x
  26.             SET @result = 1;
    . Q. G9 J. z; e3 C/ L
  27.             BREAK;
    ( @% c1 S3 {6 O$ _! w/ ]
  28.         END% Y. q& T$ X" A) R) A. m% ?
  29.         
    $ O" s: G* g) C: c5 j3 m
  30.         SET @i = @i + 1;% _0 C* p1 t3 |. t0 z' y
  31.     END;0 Q" ?: q. L( e( @
  32.    
    5 k! ~0 V3 b+ {( Q$ v
  33.     -- 检查是否在非法名称列表中
    / P# E' \6 H" y$ S/ ~
  34.     IF EXISTS (! k0 \3 v' S8 _  }
  35.         SELECT 1 5 N9 |! S5 M1 \& a0 Y
  36.         FROM dbo.illegal_character_names
    5 ]5 J( F( O4 j) M) s( o
  37.         WHERE @character_name LIKE '%' + partial_name + '%'7 i6 {2 o# F& H0 A" g5 ]/ \
  38.     )
    % X$ B8 ^4 K7 I# ^  W( @3 x# a, |* |
  39.         SET @result = 1;0 Z0 c# m% X! N+ {) {- t) r
  40.    
    ( P: _; S) H2 b$ B! k! [/ o, N% O; U
  41.     RETURN @result;) J& l2 M& N6 \& f& G. S% J
  42. END</span>
    4 c) f, ?* t& E( ]
复制代码
插入屏蔽的字符" w2 _' J" p# t' ]+ |% y  h
  1. -- 插入非法名称列表(明确列名并使用N前缀)
    5 H4 w" f: P, U2 w, m4 g' q' }
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    8 J8 `; B% j- @( i7 M5 I
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');. K8 A- B: a* `9 U. k& C4 G9 R
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');4 @7 H% a) X- k- p+ W( k# }  I. j) M
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');6 }0 E  C. u8 @" R
  6. ) R. j' Y/ o. C( P- T" e
  7. -- 示例:查询包含敏感词的角色名) h2 @) ?% X" J2 x: _
  8. SELECT *
    + r# F" y( u! S2 o
  9. FROM dbo.characters . R, ]2 d" Y9 \
  10. WHERE EXISTS (9 h, i" o. \) f% g" X
  11.     SELECT 1 + x2 ?# L! E0 a* p  R( D* u; ]8 }
  12.     FROM dbo.illegal_character_names + M4 Y2 ^! N9 z( N4 G
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    % n% U5 h& ~6 o" ?+ \! Q/ g! }
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据/ I( X2 A5 l" Z, `
原始为:
5 f# g3 z7 q) f. G
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    * n2 @" O2 S$ z  r1 h+ w- H
  2. + n1 T) d3 |" O3 ?% {/ \7 K+ H
  3. IF @v_ret < 0
    3 s4 l& y. S) N' E: f- T
  4. BEGIN
    / a2 Z8 X: C8 P  f0 c/ N" d
  5. SET @sp_rtn = @v_ret
    $ s4 I) h, g7 R
  6. RETURN# v- A' ?/ H5 C0 D/ S
  7. END
复制代码
修改为:  _! L+ v8 q" i: L8 a' [6 _
  1. IF (dbo.NameBlock(@character_name) = 1)
    - \6 n: ]/ n" J' s
  2. BEGIN# _% d6 z- I3 r- y- Z8 q  N
  3. SET @sp_rtn = -12
    0 C) e6 l- [& n' B
  4. RETURN9 I. a- e$ c3 X
  5. END
复制代码
$ w* y. a2 M6 p3 u7 F
6 s- z. B; a  g3 p8 T
* w3 e- i5 {/ d/ F9 |
9 M. |4 {! E2 d0 O2 [3 O
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-2-16 15:25 , Processed in 0.062695 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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