Sql-Server

在數據屏蔽列上使用聚合函式返回零

  • June 26, 2020

最近我們在 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。

引用自:https://dba.stackexchange.com/questions/269959