ダイナミック ビューを作成する

Unity Catalog では、動的ビューを使用して、次のようなきめ細かいアクセス制御を構成できます。

  • 列または行レベルでのセキュリティ。

  • データマスキング。

注:

動的ビューを使用したきめ細かなアクセス制御は、シングル ユーザーアクセス モードのクラスターでは使用できません。

Unity Catalog では、ビュー内の行、列、またはレコードにアクセスできるユーザーを動的に制限できる次の関数が導入されています。

  • current_user(): 現在のユーザーの電子メールアドレスを返します。

  • is_account_group_member(): 現在のユーザーが特定のアカウント レベルのグループのメンバーである場合はTRUEを返します。 Unity Catalogデータに対する動的ビューでの使用が推奨されます。

  • is_member(): 現在のユーザーが特定のワークスペース レベルのグループのメンバーである場合はTRUEを返します。 この関数は、既存のHive metastoreとの互換性のために提供されています。 アカウント レベルのグループ メンバーシップを評価しないため、Unity Catalog データに対するビューでは使用しないでください。

Databricks では、ビューで参照されるテーブルとビューを読み取る権限をユーザーに付与しないことをお勧めします。

次の例は、Unity Catalog で動的ビューを作成する方法を示しています。

列レベルの権限

動的ビューを使用すると、特定のユーザーまたはグループがアクセスできる列を制限できます。 次の例では、 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

行レベルの権限

動的ビューでは、行レベルまたはフィールド レベルまで権限を指定できます。 次の例では、取引金額が 1,000,000 ドルを超える場合、 managersグループのメンバーだけがその取引金額を表示できます。 一致する結果は、他のユーザーに対してフィルターで除外されます。

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 CatalogのビューはSpark SQLを使用するため、より複雑なSQL式や正規表現を使用して高度なデータマスキングを実装できます。 次の例では、すべてのユーザーが E メール ドメインを分析できますが、ユーザーの E メール アドレス全体を表示できるのは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