分享方式:


建立動態檢視

在 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