您可以在此处重现该问题:
CREATE TABLE [dbo].[EmployeeDataMasking](
[RowId] [int] IDENTITY(1,1) NOT NULL,
[EmployeeId] [int] NULL,
[LastName] [varchar](50) MASKED WITH (FUNCTION = 'partial(2, "XXXX", 2)') NOT NULL,
[FirstName] [varchar](50) MASKED WITH (FUNCTION = 'partial(2, "XXXX", 2)') NOT NULL,
CONSTRAINT [PK_EmployeeDataMasking] PRIMARY KEY CLUSTERED
(
[RowId] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY],
) ON [PRIMARY]
GO
Insert Into dbo.EmployeeDataMasking (EmployeeId, LastName, FirstName)
VALUES( 1,'Smithsonian','Daniel'),( 2,'Templeton','Ronald')
Select
EmployeeId,
LastName,
FirstName,
LastName + ', ' + FirstName
From dbo.EmployeeDataMasking
请注意 LastName 和 FirstName 字段被部分屏蔽(如预期的那样)。但是,组合名称字段包含默认掩码。我不知道这是否被认为是一个错误。但是,我认为组合字段将保留它包含的两个字段的掩码。至少这是我更喜欢的,因为我不知道如何为组合字段提供掩码。
文档对于掩码列是表达式的一部分时的行为是可耻的沉默。
这是执行计划中屏蔽列的表示方式:
这里
(3)
表示屏蔽函数类型,对应partial
屏蔽。这就是
LastName + ', ' + FirstName
表达式的表示方式:如您所见,行为是“计算,然后屏蔽”。本例中的屏蔽函数类型为
(1)
,对应于default
屏蔽。这是掩蔽功能调整和有意修改的结果。使用“计算,然后掩码”的方法,这(掩码调整)显然是必要的措施,因为否则简单的表达式涉及
LEFT
,RIGHT
或SUBSTRING
函数可以轻松地取消掩码数据。并且确定表达式是否“安全”可能太复杂了。我只能猜测为什么方法是“计算,然后掩码”而不是“掩码,然后计算”,但我认为后者在实施时会遇到自己的问题。我能想到的一些包括数字类型的算术错误的可能性(例如除以零,例如,如果将某些内容划分为屏蔽列),或逻辑偏差的可能性(如果存在依赖于屏蔽的条件表达式柱子)。