You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server掩码列FOR JSON PATH赋值变量时JSON结构丢失问题

问题背景

测试环境为SQL Server Standard(64位)14.0.1000~169版本,数据库已启用动态数据掩码功能,测试表结构及初始化数据如下:

CREATE TABLE [dbo].[Test](
     [Column1] [VARCHAR(64)] NULL,
     [Column2] [VARCHAR(64)] NULL
)
GO
INSERT INTO [dbo].[Test]
VALUES ('ABCDEFG', 'HIJKLMN')

为Column1列配置默认掩码规则的语句如下:

ALTER TABLE [dbo].[Test]
ALTER COLUMN [Column1] VARCHAR(64) MASKED WITH (FUNCTION = 'default()');
异常复现
  • 正常表现:无UNMASK权限的普通用户直接执行带FOR JSON PATH的查询时,掩码规则生效、JSON结构完整,符合预期:
SELECT [Column1], [Column2]
FROM [dbo].[Test]
FOR JSON PATH
-- 返回结果: '[{"Column1":"xxxx", "Column2":"HIJKLMN"}]'
  • 异常表现:同一无UNMASK权限的用户将上述查询结果直接赋值给VARCHAR变量时,JSON结构完全丢失,仅返回掩码列的替换值xxxx,无法得到合法JSON:
DECLARE @var VARCHAR(64)
SET @var = (SELECT [Column1], [Column2] FROM [dbo].[Test] FOR JSON PATH)
SELECT @var
-- 实际返回: 'xxxx'
-- 预期返回: '[{"Column1":"xxxx", "Column2":"HIJKLMN"}]'

核心问题:SELECT语句包含被动态数据掩码管控的列且使用FOR JSON PATH子句时,直接将结果赋值给变量会导致JSON结构损坏、内容丢失。

已验证信息
  • sa账号默认持有UNMASK权限,执行上述变量赋值操作无异常,可正常返回完整JSON结果
  • 已测试无效的方案:将变量类型改为NVARCHAR、对掩码列做CAST转换
  • 已测试可生效的临时方案:先将查询结果写入临时表,再基于临时表生成FOR JSON结果,但该方案需要额外的临时表读写开销,期望更轻量的实现方式
需求目标

需要实现无论查询列是否配置掩码规则、执行用户是否持有UNMASK权限,FOR JSON PATH查询结果赋值给变量时都能返回结构合法的完整JSON:非授权用户返回的JSON中掩码列正常展示掩码值,不会出现JSON结构丢失仅返回掩码字符串的问题。


内容的提问来源于stack exchange,提问作者Moises Hernandez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 13:24:26