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

SQL Server MERGE语句用MASKED列作匹配键时插入掩码值问题咨询

SQL Server中MERGE语句结合动态数据掩码的异常问题

我们在SQL Server中使用MASKED列特性(动态数据掩码)隐藏查询时的敏感数据,但遇到异常场景:MERGE语句的INSERT分支会插入掩码值,即使拥有UNMASK权限的用户查询该表,新插入的值仍显示为掩码状态。

触发该场景的条件:

  • 某列设置为MASKED;
  • 当前执行MERGE的用户无UNMASK权限;
  • MERGE语句的ON子句使用该MASKED列作为匹配条件;
  • MERGE语句未匹配到目标数据,进入INSERT分支执行插入操作。

最小复现代码:

-- 定义包含掩码列和非掩码列的测试表
CREATE TABLE TestTable(
     C1 NVARCHAR(100) MASKED WITH (FUNCTION = 'default()'),
     C2 NVARCHAR(100) MASKED WITH (FUNCTION = 'default()'),
     C3 NVARCHAR(100) -- 未设置掩码
);

INSERT INTO TestTable
VALUES ('aaa', 'aaa', 'aaa'), ('bbb', 'bbb', 'bbb')

-- 打印当前用户及初始表数据
SELECT SUSER_NAME() AS LoginName, USER_NAME() AS UserName;
SELECT *, '无列应被掩码' FROM TestTable

-- 创建测试用户
CREATE USER user1 WITHOUT LOGIN
-- 授予权限(不包含UNMASK)
GRANT SELECT, UPDATE, INSERT TO user1;   

-- 切换到无UNMASK权限的用户上下文
EXECUTE AS USER = 'user1';  

-- 验证该用户只能看到掩码后的数据
SELECT SUSER_NAME() AS LoginName, USER_NAME() AS UserName;
SELECT *, '列1和列2应被掩码' FROM TestTable

-- 执行MERGE语句,基于掩码列C1进行匹配
MERGE TestTable target
USING (
    SELECT * FROM (VALUES 
        ('bbb', 'bbb', 'bbb'), -- 会匹配到现有数据,执行UPDATE
        ('ccc', 'ccc', 'ccc'), -- 无匹配,执行INSERT
        ('ddd', 'ddd', 'ddd')) -- 无匹配,执行INSERT
        AS s (C1 ,C2 ,C3)
) AS source
ON (source.C1 = target.C1)
WHEN MATCHED THEN UPDATE SET
    target.C2 = source.C2,
    target.C3 = source.C3
WHEN NOT MATCHED BY TARGET
  THEN INSERT (C1, C2, C3)
  VALUES (source.C1, source.C2, source.C3);

-- 执行常规INSERT语句作为对比
INSERT INTO TestTable
VALUES ('eee', 'eee', 'eee')

-- 打印当前用户及表数据
SELECT SUSER_NAME() AS LoginName, USER_NAME() AS UserName;
SELECT *, '列1和列2应被掩码' FROM TestTable

REVERT; -- 切换回原会话用户上下文

-- 打印当前用户及表数据(拥有UNMASK权限)
SELECT SUSER_NAME() AS LoginName, USER_NAME() AS UserName;
SELECT *, '无列应被掩码' FROM TestTable
  
-- 清理测试资源
DROP TABLE TestTable;
DROP USER user1;

问题现象:

拥有UNMASK权限的用户执行最后一条SELECT语句后发现,无UNMASK权限用户通过MERGE插入的ccc、ddd两行数据中,作为匹配键的C1列仍呈现掩码状态(而非原始插入的ccc、ddd)。推测这是因为MERGE在插入时实际写入了掩码值,而非单纯的权限显示问题。

请问这是SQL Server的已知问题,还是我的操作存在错误?

内容的提问来源于stack exchange,提问作者Andy Lamb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 02:53:09