この記事では、結果のアクセス制御を含め、Databricks SQL で具体化されたビューを構成する方法について説明します。 ほとんどの構成は、 CREATE OR REPLACE MATERIALIZED VIEW
ステートメントを使用して具体化されたビューを作成するとき、または作成後に ALTER TABLE
ステートメントを使用して作成するときに実行できます。
具体化されたビューを説明する
具体化されたビューの列とデータ型を取得するには、 DESCRIBE ステートメントを使用します。 具体化されたビューの列、データ型、および所有者、場所、作成時刻、更新状態などのメタデータを取得するには、DESCRIBE EXTENDED
を使用します。 DESCRIBE
ステートメントを送信するには、Azure Databricks UI の SQL エディター、Databricks SQL CLI、または Databricks SQL API を使用します。
カタログ エクスプローラーを使用して具体化されたビューに関する詳細情報を取得する
カタログ エクスプローラー を使用して、具体化されたビューに関する詳細を表示することもできます。
- [
サイドバーのカタログ。
- 左側のカタログ エクスプローラー ツリーで、カタログを開き、具体化されたビューがあるスキーマを選択します。
- 選択したスキーマの テーブル 項目を開き、具体化されたビューをクリックします。
ここから、具体化されたビュー名の下にあるタブを使用して、マテリアライズド ビューに関する次のような情報を表示および編集できます。
- 更新の状態とスケジュール
- 更新の履歴と各更新の詳細ログについては、パイプラインの詳細を参照してください。 [概要] タブで [更新の詳細を表示] をクリックして、パイプラインの詳細を表示します。
- テーブル スキーマ
- サンプル データ (アクティブなコンピューティングが必要)
- 権限
- 系列 (この具体化されたビューが依存するテーブルとパイプラインを含む)
- 使用状況に関する分析情報
- この具体化されたビュー用に作成したモニター
カタログ エクスプローラーでは使用できないテーブルのプロパティがいくつかあります。 これらのプロパティの場合、またはプログラムで情報を取得するには、 DESCRIBE EXTENDED コマンドを使用できます。
具体化されたビューの定義を更新する
具体化されたビューを指定するクエリは、その定義です。 具体化されたビューの定義を変更するには、クエリを編集するか、同じビュー名を持つ新しい CREATE または REPLACE MATERIALIZED VIEW クエリを作成して実行します。 具体化されたビューを更新するために完全な更新が実行され、さらに更新では新しい定義が使用されます。
具体化されたビューの所有者の変更
メタストア管理者とワークスペース管理者の両方である場合は、具体化されたビューの所有者を変更できます。具体化されたビューは、Lakeflow 宣言パイプラインを自動的に作成して使用して変更を処理します。 具体化されたビューの所有者を変更するには、次の手順に従います。
- カタログ エクスプローラーで具体化されたビューを開き、[概要] タブで [更新の詳細を表示] をクリックします。 これにより、具体化されたビューを管理するパイプラインのパイプラインの詳細が開きます。
- [共有] をクリックします。 [権限の設定] ダイアログが表示されます。 これらの設定を編集するには、メタストアとワークスペースの管理者である必要があります。
- 現在の所有者の名前の右側にある [x ] をクリックして、現在の所有者を削除します。
- 入力を開始して選択可能なユーザーの一覧をフィルター処理することもできます。 新しいパイプライン所有者にするユーザーをクリックします。
- [保存] をクリックして変更を保存し、ダイアログを閉じます。
パイプラインで定義された具体化されたビューを含むすべてのパイプライン資産は、新しいパイプライン所有者によって所有されます。 今後のすべての更新は、新しい所有者の ID を使用して実行されます。
所有者がソース テーブルに対する権限を失った場合
所有者を変更しても、新しい所有者がソース テーブルにアクセスできない場合 (または、基になるソース テーブルに対する SELECT
権限が取り消された場合)、ユーザーはマテリアライズド ビューに対してクエリを実行できます。 ただし
- 具体化されたビューを
REFRESH
することはできません。 - 具体化されたビューの次回のスケジュールされた更新は失敗します。
ソース データへのアクセスを失っても更新はできなくなりますが、既存の具体化されたビューが読み取られるのをすぐに無効にすることはできません。
具体化されたビューへのアクセスを制御する
具体化されたビューでは、プライベート データの公開を回避しながら、データ共有をサポートする豊富なアクセス制御がサポートされています。 具体化されたビューの所有者または MANAGE
権限を持つユーザーは、他のユーザーに SELECT
権限を付与できます。 具体化されたビューへの SELECT
アクセスを持つユーザーは、具体化されたビューによって参照されるテーブルへの SELECT
アクセスを必要としません。 このアクセス制御により、基になるデータへのアクセスを制御しながらデータ共有が可能になります。
具体化されたビューへの権限を付与する
具体化されたビューへのアクセスを許可するには、 GRANT ステートメントを使用します。
GRANT <privilege_type> ON <mv_name> TO <principal>;
privilege_type は次のとおりです。
SELECT
- ユーザーは具体化されたビューをSELECT
できます。REFRESH
- ユーザーは具体化されたビューをREFRESH
できます。 更新は、所有者のアクセス許可を使用して実行されます。
次の例では、具体化されたビューを作成し、選択権限と更新権限をユーザーに付与します。
CREATE MATERIALIZED VIEW mv_name AS SELECT * FROM source_table;
-- Grant read-only access:
GRANT SELECT ON mv_name TO read_only_user;
-- Grand read and refresh access:
GRANT SELECT ON mv_name TO refresh_user;
GRANT REFRESH ON mv_name TO refresh_user;
マテリアライズドビューから権限を削除する
具体化されたビューからアクセスを取り消すには、 REVOKE ステートメントを使用します。
REVOKE privilege_type ON <mv_name> FROM principal;
具体化されたビューの所有者、または具体化されたビューに対するSELECT
権限またはMANAGE
権限が付与されている他のユーザーからソース テーブルに対するSELECT
権限が取り消された場合、またはソース テーブルが削除された場合でも、具体化されたビューの所有者またはユーザーがマテリアライズド ビューに対してクエリを実行できます。 ただし、次の動作が発生します。
- 具体化されたビューの所有者または具体化されたビューへのアクセスを失った他のユーザーは、その具体化されたビューに対し
REFRESH
を実行できなくなり、具体化されたビューは古くなります。 - スケジュールが自動化されている場合、次にスケジュールされた
REFRESH
は失敗するか、実行されません。
次の例では、SELECT
から read_only_user
権限を取り消します。
REVOKE SELECT ON mv_name FROM read_only_user;
ランタイム チャネルを設定する
SQL ウェアハウスを使用して作成された具体化されたビューは、パイプラインを使用して自動的に更新されます。 Lakeflow 宣言型パイプラインでは、既定で current
チャネルのランタイムが使用されます。 リリース プロセスについては、 Lakeflow 宣言型パイプラインのリリース ノートとリリース アップグレード プロセス に関するページを参照してください。
Databricks では、運用ワークロードに current
チャネルを使用することをお勧めします。 新機能は、最初に preview
チャネルにリリースされます。 パイプラインをプレビューの Lakeflow 宣言型パイプライン チャネルに設定して、テーブル プロパティとして preview
を指定することで、新機能をテストできます。 このプロパティは、テーブルを作成するとき、または ALTER ステートメントを使用してテーブルを作成した後に指定できます。
次のコード例は、CREATE ステートメントでチャネルをプレビューに設定する方法を示しています。
CREATE OR REPLACE MATERIALIZED VIEW sales
TBLPROPERTIES ('pipelines.channel' = 'preview')
AS ...
作成後にチャネルを変更するには、 ALTER TABLE
ステートメントを使用します。
ALTER TABLE <table-name> SET TBLPROPERTIES ('pipelines.channel' = 'preview');