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

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

[复制链接]

164

主题

416

回帖

7820

积分

管理员

积分
7820
金钱
2282
贡献
4958
注册时间
2023-11-3
QQ
发表于 2025-6-6 20:25:12 | 显示全部楼层 |阅读模式
建立新的限制表
3 o/ z& ~1 j4 m4 S' Y* p. o) f6 a/ _
  1. CREATE TABLE illegal_character_names (partial_name varchar(30))
复制代码
建立新的函数
& ]6 B! S: d  m% O/ @; w: k
  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 (
    - G& |# I- V  Z0 P/ W
  2.     @character_name NVARCHAR(40)
      t* U; _- H" ~
  3. )
    , }- v  Q5 {8 f# [: h
  4. RETURNS TINYINT
    & v4 Q& \: }$ u2 y
  5. AS' \3 M- R5 a% e
  6. BEGIN
    3 q( i& X6 d8 R3 c1 X
  7.     DECLARE @result TINYINT = 0;1 Y' k8 B& ]3 b7 C3 V" m: p
  8.     DECLARE @char NVARCHAR(1);/ g1 v' f8 U( Z
  9.     DECLARE @i INT = 1;
    4 [& P5 o8 N0 _2 D$ g- E; J
  10.    
    0 h) h; S& o( ]& M$ l
  11.     -- 遍历每个字符,检查是否合法9 r9 `+ i  y: f
  12.     WHILE @i <= LEN(@character_name)
    ; C( Z& {! a! J7 b+ U
  13.     BEGIN
    " k: T/ H4 }4 h6 G0 j4 J' S
  14.         SET @char = SUBSTRING(@character_name, @i, 1);
    + ~" x! H6 ^- A. P1 z# y0 j
  15.         $ |; |7 ~7 c( x+ U0 s; \
  16.         -- 检查是否为中文、英文、数字或允许的特殊符号' ]  i# p8 s; S8 p5 u0 |# G$ A) e1 C
  17.         IF NOT (
    9 ^* u9 w2 l( H2 g9 k/ o
  18.             -- 中文字符范围 (基本多文种平面)
    / P4 o" f( V2 Z/ w
  19.             UNICODE(@char) BETWEEN 0x4E00 AND 0x9FFF OR
    " m, G% A1 r6 N% q' n+ F0 P
  20.             -- 英文字母和数字
    * B. a- L" W2 X2 p# l$ n% H
  21.             @char LIKE '[a-zA-Z0-9]' OR
    9 k) J. x" d( k: T( b0 y
  22.             -- 允许的特殊符号- l" V+ Q7 C. a3 _$ Q
  23.             @char LIKE '[_ -]'# v$ M! L- T4 d4 c) {
  24.         )
    1 `: K0 I) m; z) Z
  25.         BEGIN
    0 ]; r. W- V3 s# f% u$ \2 Q
  26.             SET @result = 1;
    # R! o$ F1 w2 w4 F* z/ F
  27.             BREAK;
    ! D3 {8 l) a5 N" l
  28.         END
    + Q1 ?9 G# S9 x7 Z" m% Z
  29.         & G4 @1 d* u: }1 F9 G' U% M
  30.         SET @i = @i + 1;8 ~9 [; M9 J/ y6 a
  31.     END;; M5 A- n+ F- L8 c& {" p5 @
  32.    
    * R) H  E  e: \( W# @
  33.     -- 检查是否在非法名称列表中8 g, q4 Z8 w9 n' b8 j
  34.     IF EXISTS (1 `% ?2 X0 Q' C' o: s* y! v
  35.         SELECT 1 9 c. m5 K0 j0 }0 _$ I% w
  36.         FROM dbo.illegal_character_names
    * e, O# A6 q6 V
  37.         WHERE @character_name LIKE '%' + partial_name + '%'' ^  F# ~3 d0 O2 j* F8 ?
  38.     )# P' i' `  ]- J0 Y
  39.         SET @result = 1;
      [8 g  q2 v7 c& C% \& C+ x4 g
  40.     . k; W, I1 X- G" Z/ B
  41.     RETURN @result;
    # H& P! Y1 u4 ]; v. _! `; f# u
  42. END</span>* U. {3 L: D1 E# i. d
复制代码
插入屏蔽的字符
: Y" i% ~2 l2 i( v7 r
  1. -- 插入非法名称列表(明确列名并使用N前缀)+ H) d5 o; B  ?9 I1 o' _4 |
  2. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%****%');5 ~. x8 R) n( y+ }) y( U: X5 a( [8 j2 U
  3. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%nigg%');2 t1 e' Y$ s% i( P2 m. D. K
  4. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%wank%');9 G( D9 k! M% u3 ]4 z7 }1 m/ F
  5. INSERT INTO dbo.illegal_character_names (partial_name) VALUES (N'%whore%');
    3 F& }8 T2 L9 h$ z

  6. ( [; ^! Y- G6 ?0 a+ d! \" Z& ]( A
  7. -- 示例:查询包含敏感词的角色名
    2 B5 p# L4 N" d) ]6 w' D
  8. SELECT *
    & [! d0 ?2 }/ f) d  O: \% B% A
  9. FROM dbo.characters
    ( {/ q8 V9 A, i
  10. WHERE EXISTS (
      v1 `4 [. K& t! P8 G' {' G
  11.     SELECT 1 / u4 }$ \. w! z- E
  12.     FROM dbo.illegal_character_names   P, _, F, d" F" Q) z; o
  13.     WHERE characters.name LIKE N'%' + illegal_character_names.partial_name + N'%'
    + U% I, s. z7 S+ V
  14. );
复制代码
修改储存过程  SP_CHAR_CREATE 里面数据5 `/ B4 `" w0 a% n
原始为:* k6 }4 u) `' ~# A
  1. EXEC sp_char_name_check @character_name, @v_ret OUTPUT
    1 u5 e9 H! S. h

  2. $ \4 W/ L* K. t6 w
  3. IF @v_ret < 0 5 H7 k, \& v& y
  4. BEGIN* i  m& n) U- Y3 m
  5. SET @sp_rtn = @v_ret. V- K# b* s! Y  q4 S1 e4 z4 c
  6. RETURN
    * K, R! r; L2 W  z% H
  7. END
复制代码
修改为:+ h/ R2 S' f( k) D( Z
  1. IF (dbo.NameBlock(@character_name) = 1)8 n6 ?+ ?# o, M. @5 p9 `
  2. BEGIN
    4 j$ ]. a1 z9 E4 a* H% m- p" w$ W
  3. SET @sp_rtn = -12
    ( u6 _' D1 y( c: r/ F
  4. RETURN- r% k% N# R3 V  L- [7 K& K
  5. END
复制代码

" \2 U7 A, V1 T. ?5 y9 ^% T6 N9 J/ S# ]/ w  e
' j. m3 z+ a4 |! Y

, ^1 m' p0 `) T  O8 P8 N0 `! b7 {
商业服务端 登录器 网站 出售
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Archiver|小黑屋|EGameol

GMT+8, 2026-7-3 04:37 , Processed in 0.068859 second(s), 30 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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