在 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