共用方式為


資料行 mask 子句

適用於:核取記號為「是」Databricks SQL 核取記號為「是」 Databricks Runtime 12.2 LTS 和更新版本 核取記號為「是」 僅限 Unity Catalog

指定每當從資料表擷取資料列時,就會套用至資料行的函式。 該資料行的所有後續查詢都會收到針對資料行中該函式的評估結果,而不是該資料行的原始值。 這適用於更細緻的存取控制,其中函式可以檢查叫用使用者的身分識別或群組成員資格,以確定是否要修訂該值。

您可以在下列情況下新增資料行遮罩:

重要

一旦從資料來源擷取每個資料列,就會套用遮罩。 遮罩之後會套用任何運算式、述詞或排序。 例如,遮罩資料行與另一個資料表中的另一個資料行之間的聯結將會使用遮罩值來進行聯結比較。

如需有關如何使用資料行遮罩的詳細資訊,請參閱使用資料列篩選和資料行遮罩篩選敏感資料表資料

語法

MASK func_name [ USING COLUMNS ( other_column_name | constant_literal [, ...] ) ]

參數

  • func_name

    至少有一個參數的純量 SQL UDF

    SQL UDF 的第一個參數與遮罩的資料行 1:1 對應。 遮罩的資料行類型必須可轉換成 SQL UDF 參數類型。 如果 func_name 需要更多參數,USING COLUMNS 子句必須提供引數。

    函式的傳回類型必須可轉換成遮罩資料行的資料類型。

  • other_column_name

    選擇性地指定要傳遞至 func_name 之遮罩資料行資料表的其他資料行。 每個 other_column_name 都必須可轉換成 func_name 的對應參數。

    使用資料行遮罩,根據對 table_namecolumn_identifier 的值和可選的 other_column 執行查詢的使用者,選擇性地匿名化 column_identifier 的值。

  • constant_literal

    指定類型與函式參數相符的常數參數。 支援下列類型:STRING、數值 (INTEGERFLOAT,DOUBLEDECIMAL …)、BOOLEANINTERVALNULL

範例

可以在使用資料列篩選和資料行遮罩篩選敏感資料表資料中找到更多範例。

-- Create a table with a masked column
> CREATE FUNCTION mask_ssn(ssn STRING) RETURN CASE WHEN is_member('HumanResourceDept') THEN ssn ELSE '***-**-****' END;
> CREATE TABLE persons(name STRING, ssn STRING MASK mask_ssn);
> INSERT INTO persons VALUES('James', '123-45-6789';

-- As a non-member of 'HumanResourceDept'
> SELECT * FROM persons;
  James  ***-**-****

-- As a member of 'HumanResourceDept'
> SELECT * FROM persons;
  James  123-45-6789

-- Create a masking function with multiple parameters. When applied first parameter will be the column that masking function applies to
> CREATE FUNCTION mask_pii_regional(value STRING, region STRING)
  RETURN IF(is_account_group_member(region || '_HumanResourceDept'), value, 'REDACTED');

-- Create a table with a masked column. Masking function first parameter will be the column that is masked.
-- The rest of the parameters should be specified in `USING COLUMNS (<columnList>)` clause
> CREATE TABLE persons(name STRING, address STRING MASK mask_pii_regional USING COLUMNS (region), region STRING);
> INSERT INTO persons('James', '160 Spear St, San Francisco', 'US')

-- As a non-member of 'US_HumanResourceDept'
> SELECT * FROM persons;
  James | REDACTED | US

-- As a member of 'US_HumanResourceDept'
> SELECT * FROM persons;
  James | 160 Spear St, San Francisco | US