Sql-Server
在數據屏蔽列上使用聚合函式返回零
最近我們在 SQL Server 2019 數據庫中實現了動態數據屏蔽,以便對開發人員隱藏敏感資訊。但是,出於測試目的,我希望他們看到接近真實的值,所以我的面具看起來像這樣:
CREATE TABLE fin.Salaries ( TargetMonth DATE NOT NULL, Login VARCHAR(100) NOT NULL, Department VARCHAR(100) NOT NULL, AmountUSD MONEY MASKED WITH (FUNCTION = 'random(500, 5000)') NOT NULL, CONSTRAINT PK_Salaries PRIMARY KEY CLUSTERED (TargetMonth, Login, Department) )
它適用於簡單查詢,但聚合函式似乎總是返回零值。我在文件中沒有找到任何關於此的內容,所以問題是這是否是預期的行為,有沒有辦法從聚合數據屏蔽列中獲取非零值?
SELECT TargetMonth, AVG(AmountUSD) -- Returns all zeroes FROM fin.Salaries GROUP BY TargetMonth
由於動態數據屏蔽是在將查詢結果返回給使用者之前執行的,因此應用諸如此類的函式
AVG
不會將屏蔽數據作為結果集。您可以在執行計劃中看到這一點,屏蔽函式出現在 select 之前(換句話說,將數據返回給使用者):
雖然實際的聚合發生在遮罩函式後面的計算標量中:
和是一個計數和一個總和
[EXPR1008]
:[EXPR1009]
<ColumnReference Column="Expr1008" /> <ScalarOperator ScalarString="Count(*)"> <Aggregate AggType="countstar" Distinct="false" /> <ColumnReference Column="Expr1009" /> <ScalarOperator ScalarString="SUM([Test].[dbo].[Salaries].[AmountUSD])">
並且,在聚合函式之後應用 datamask 函式時,該函式的結果將其設置為 0
DataMask([Expr1002],0x05000000,(1),(0),(0),(0))
。這並不意味著
DataMask
聚合門和相應數據類型上的所有函式執行都將返回 0,只是在這種情況下會返回 0。