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

