ダイナミック ビューを作成する
Unity Catalog では、動的ビューを使用して、次のようなきめ細かいアクセス制御を構成できます。
列または行レベルでのセキュリティ。
データマスキング。
Unity Catalog では、ビュー内の行、列、またはレコードにアクセスできるユーザーを動的に制限できる次の関数が導入されています。
current_user()
: 現在のユーザーの電子メールアドレスを返します。is_account_group_member()
: 現在のユーザーが特定のアカウント レベルのグループのメンバーである場合はTRUE
を返します。 Unity Catalogデータに対する動的ビューでの使用が推奨されます。is_member()
: 現在のユーザーが特定のワークスペース レベルのグループのメンバーである場合はTRUE
を返します。 この関数は、既存のHive metastoreとの互換性のために提供されています。 アカウント レベルのグループ メンバーシップを評価しないため、Unity Catalog データに対するビューでは使用しないでください。
Databricks では、ビューで参照されるテーブルとビューを読み取る権限をユーザーに付与しないことをお勧めします。
次の例は、Unity Catalog で動的ビューを作成する方法を示しています。
始める前に
動的ビューを作成または読み取るための要件は、コンピュート要件を除いて、標準ビューの場合と同じです。 次のコンピュート リソースのいずれかを使用する必要があります。
SQLウェアハウス。
共有アクセスモードによるコンピュート。
列レベルの権限
動的ビューを使用すると、特定のユーザーまたはグループがアクセスできる列を制限できます。 次の例では、 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