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
相关产品推荐
相关产品推荐

