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

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

[复制链接]

157

主题

362

回帖

6843

积分

管理员

积分
6843
金钱
1944
贡献
4380
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表* G& q- M' B3 ~
9 X. e5 N. |) Q, W- n
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数% F- H0 p3 Z7 B1 z( D$ L* S% s
  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 (+ K) I+ p( L% q; b5 }) q# c
  2.     @character_name NVARCHAR(40)  o3 L) e, y7 \2 F8 R. u
  3. )* R6 G, `, x. O. [& `* ?
  4. RETURNS TINYINT% L8 I9 q: I7 u6 y2 d5 n* \: Y
  5. AS% D0 N3 q! Q) p
  6. BEGIN
    ' R2 {4 W6 e) L
  7.     DECLARE @result TINYINT = 0;$ j2 e% D6 O( g" g
  8.     DECLARE @char NVARCHAR(1);) e( g- o1 o9 c$ U6 K
  9.     DECLARE @i INT = 1;. c5 X) @" ]* z6 d
  10.    
    # b3 v& h! b4 Z
  11.     -- 遍历每个字符,检查是否合法8 O2 w( y  ~3 J& |8 ~: e& Y
  12.     WHILE @i <= LEN(@character_name)( r8 z7 Q& I/ p
  13.     BEGIN/ h7 t5 i! w2 ]3 x" x; n2 q
  14.         SET @char = SUBSTRING(@character_name, @i, 1);& h9 D1 t( Y; t; s( M
  15.         , l* i, q1 Q3 T5 G6 z: N3 s+ Z
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号, j4 r7 @+ O3 H, W( Q9 M: m
  17.         IF NOT (4 Y/ y" ], Q4 d- k4 c9 b) h
  18.             -- 中文字符范围 (基本多文种平面)
    & p0 c( S! V, D/ N# |/ M
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR! {7 k: J3 a4 K; }# ]. l4 f
  20.             -- 英文字母和数字8 }" L. X( b: I) N, E
  21.             @char LIKE '[a-zA-Z0-9]' OR' f/ J$ p' m4 J, }. q$ I: F
  22.             -- 允许的特殊符号2 c$ h& T  Y" l7 m
  23.             @char LIKE '[_ -]'
    0 E4 W6 T/ c7 |/ W  d
  24.         )5 ^: X' {' B  w1 k# u5 i% I
  25.         BEGIN
    7 M0 i0 V0 V9 A) s& K% R8 N9 f
  26.             SET @result = 1;7 t; g5 u* ]! s  ?7 N* u8 C7 ]
  27.             BREAK;
    3 C& ?' S8 ^" \4 F+ |6 C
  28.         END9 S$ e! P0 j) j6 c& K  V
  29.         - {7 d4 K0 L) I' }3 u$ w
  30.         SET @i = @i + 1;
    " u" L% V) D% u9 k- h7 d6 P
  31.     END;
    & ?' V6 m& q* P6 ?/ U8 }# i% ?
  32.    
    " Q- Y* Z6 F- m& C
  33.     -- 检查是否在非法名称列表中& v( {- n, u4 E: u
  34.     IF EXISTS (; w% @8 E' U8 H" v. j7 E
  35.         SELECT 1
    / p1 w4 S* z  L7 ?. w0 q- W, H. ]
  36.         FROM dbo.illegal_character_names
    . n- x, D: p  j! Q8 J3 N( {- [7 ~% Z
  37.         WHERE @character_name LIKE '%' + partial_name + '%'
    - t7 C+ r' }  X; x0 L. W2 o
  38.     )- D5 y7 B4 P+ e( x' C1 \
  39.         SET @result = 1;
    & P# o( T$ \3 ~
  40.     4 V, r4 a' Z$ c  H3 Y
  41.     RETURN @result;' R. Q$ p9 n: m2 v& O
  42. END</span>2 C; h/ h5 |4 `8 H
复制代码
插入屏蔽的字符
% O+ e% K! S4 N. X# b
  1. -- 插入非法名称列表(明确列名并使用N前缀)$ F( }# s9 A( Y; q4 Q' I
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');
    1 D; \1 E0 D6 A# y) t$ [7 ~2 U
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');
    ( F  J4 W; ~( z& C8 z( t' Y
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');; B  c5 ~/ |8 ?
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');7 q* a  ]' e6 e9 y* L7 C8 ^
  6. ! s7 j9 l) @+ _5 f
  7. -- 示例:查询包含敏感词的角色名# u& S+ h0 ~8 J0 x6 K, ^
  8. SELECT *
    + c3 @( c: u( a1 i0 Y
  9. FROM dbo.characters * c# D. H3 M8 s: O
  10. WHERE EXISTS (( H) T% F* s7 g' h
  11.     SELECT 1 9 y$ @" V5 Y& X1 P; h- n) w8 i3 z9 P
  12.     FROM dbo.illegal_character_names $ O  `" ?) ~) T* Z5 q* o
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'6 r9 p4 a& U- ?) T; j+ v8 O
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据
1 w- n. D3 Q/ Z; A: y+ B) w原始为:
5 ^& w$ t5 Q8 @$ ~* K
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT+ g. |: N: Z+ Z. l, p

  2. # c% U! n: l9 K9 Q% e
  3. IF @v_ret < 0 3 T; \/ }' W) p$ g
  4. BEGIN
    : j0 R) A) f* K/ k& @
  5. SET @sp_rtn = @v_ret; v2 L9 q( u% {7 M
  6. RETURN
    / [. V  O' n: |. ]" x5 ^
  7. END
复制代码
修改为:
3 p  W2 b5 A- c6 w# G
  1. IF (dbo.NameBlock(@character_name) = 1)
    ! E  W5 L9 a) u# ?! u
  2. BEGIN
    + p8 j1 z( j& l, n/ g+ j' s
  3. SET @sp_rtn = -12& T. T9 d$ p; t9 }  G. ?
  4. RETURN
    ) B3 f  l( \+ ^: T8 Z
  5. END
复制代码

7 r2 d) U6 O. K  R. a* _& o1 D0 Z& f, w
# ?+ O( w4 b. s+ a" n9 \

  I! n* e' k: `6 N8 v& [, i
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-2-16 12:51 , Processed in 0.047608 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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