建立動態檢視
在 Unity 目錄中,您可以使用動態檢視來設定更細緻的訪問控制,包括:
- 數據行或數據列層級的安全性。
- 數據遮罩。
Unity 目錄引進下列功能,可讓您動態限制哪些使用者可以在檢視中存取數據列、數據行或記錄:
current_user()
:傳回目前使用者的電子郵件位址。is_account_group_member()
:如果目前使用者是特定帳戶層級群組的成員,則傳TRUE
回 。 建議針對 Unity 目錄數據在動態檢視中使用。is_member()
:如果目前使用者是特定工作區層級群組的成員,則傳TRUE
回 。 提供此函式是為了與現有的Hive中繼存放區相容。 請避免將它與 Unity 目錄數據的檢視搭配使用,因為它不會評估帳戶層級群組成員資格。
Azure Databricks 建議您不授與使用者讀取檢視中所參考數據表和檢視的能力。
下列範例說明如何在 Unity 目錄中建立動態檢視。
開始之前
若要建立或讀取動態檢視,除了計算需求之外,需求與標準檢視的需求相同。 您必須使用下列其中一個計算資源:
SQL 倉儲。
使用共用存取模式計算。
在 Databricks Runtime 15.4 LTS 或更新版本上使用單一使用者存取模式進行計算。
您無法在 Databricks Runtime 15.3 或更新版本上使用單一使用者計算來讀取動態檢視。
若要利用 Databricks Runtime 15.4 LTS 和更新版本所提供的數據篩選,您也必須確認 您的工作區已啟用無伺服器計算,因為支援動態檢視的數據篩選功能會在無伺服器計算上執行。 因此,當您使用單一使用者計算來讀取動態檢視時,可能會向您收取無伺服器計算資源的費用。 請參閱 單一用戶計算的細微訪問控制。
數據行層級許可權
透過動態檢視,您可以限制特定使用者或群組可以存取的數據行。 在下列範例中,只有群組的成員 auditors
才能從 sales_raw
數據表存取電子郵件位址。 在查詢分析期間,Apache Spark 會將 CASE
語句取代為常值字串 REDACTED
或電子郵件地址數據行的實際內容。 其他數據行會以正常方式傳回。 此策略對查詢效能沒有負面影響。
-- Alias the field 'email' to itself (as 'email') to prevent the
-- permission logic from showing up directly in the column name results.
CREATE VIEW sales_redacted AS
SELECT
user_id,
CASE WHEN
is_account_group_member('auditors') THEN email
ELSE 'REDACTED'
END AS email,
country,
product,
total
FROM sales_raw
數據列層級許可權
透過動態檢視,您可以指定數據列或欄位層級的許可權。 在下列範例中,只有群組的成員 managers
才能在超過 $1,000,000 時檢視交易金額。 比對結果會篩選出給其他使用者。
CREATE VIEW sales_redacted AS
SELECT
user_id,
country,
product,
total
FROM sales_raw
WHERE
CASE
WHEN is_account_group_member('managers') THEN TRUE
ELSE total <= 1000000
END;
資料遮罩
由於 Unity 目錄中的檢視使用 Spark SQL,因此您可以使用更複雜的 SQL 運算式和正則表示式來實作進階數據遮罩。 在下列範例中,所有使用者都可以分析電子郵件網域,但只有群組的成員 auditors
可以檢視用戶的整個電子郵件位址。
-- The regexp_extract function takes an email address such as
-- user.x.lastname@example.com and extracts 'example', allowing
-- analysts to query the domain name.
CREATE VIEW sales_redacted AS
SELECT
user_id,
region,
CASE
WHEN is_account_group_member('auditors') THEN email
ELSE regexp_extract(email, '^.*@(.*)$', 1)
END
FROM sales_raw