次の方法で共有


CREATE MATERIALIZED VIEW

適用対象: Databricks SQL

重要

この機能はパブリック プレビュー段階にあります。

"具体化されたビュー" は、クエリに使用できる事前計算済みの結果が含まれ、更新によって入力の変更を反映させることができるビューです。 具体化されたビューが更新されるたびに、クエリ結果が再計算され、アップストリームのデータセットの変更が反映されます。 具体化されたビューはすべて、DLT パイプラインによってサポートされます。 具体化されたビューは、スケジュールに従って手動で、またはそれが含まれている DLT パイプラインをスケジュールして更新することができます。

構文

CREATE MATERIALIZED VIEW [IF NOT EXISTS]
  view_name
  [ column_list ]
  [ view_clauses ]
  AS query

column_list
   ( { column_name [ MASK clause ] [...] } [, ...] )

view_clauses
  { PARTITIONED BY (col [, ...]) |
    COMMENT view_comment |
    TBLPROPERTIES clause |
    SCHEDULE [ REFRESH ] CRON cron_string [ AT TIME ZONE timezone_id ] |
    WITH { ROW FILTER clause } } [...]

パラメーター

  • IF NOT EXISTS

    ビューが存在しない場合、作成します。 この名前のビューが既に存在する場合、CREATE VIEW ステートメントは無視されます。

    IF NOT EXISTSOR REFRESH のいずれか 1 つだけを指定できます。

  • view_name

    新しく作成されたビューの名前。 完全修飾のビュー名は一意にする必要があります。

  • column_list

    必要に応じて、ビューのクエリ結果内の列にラベルを付けます。 列の一覧を指定する場合は、列の別名の数がクエリ内の式の数と一致している必要があります。 列リストが指定されていない場合、別名はビューの本体から引き出されます。

    • column_name

      列名は一意で、クエリの出力列にマップする必要があります。

    • MASK 句

      重要

      この機能はパブリック プレビュー段階にあります。

      列マスク関数を追加して、機密データを匿名化します。 今後その列からのすべてのクエリでは、列の元の値の代わりに、列に対してその関数の評価結果を受け取ります。 これは、値を編集するかどうかを決定するために呼び出したユーザーの ID やグループ メンバーシップを関数で検査できる、きめ細かいアクセス制御に役立ちます。

  • view_clauses

    必要に応じて、パーティション分割、コメント、ユーザー定義プロパティ、新しい具体化されたビューの更新スケジュールを指定します。 各サブ句は、1 回だけ指定できます。

    • PARTITIONED BY

      テーブルをパーティション分割するための、テーブルの列の省略可能な一覧。

    • COMMENT view_comment

      テーブルについて説明する STRING リテラル。

    • TBLPROPERTIES

      必要に応じて、1 つ以上のユーザー定義プロパティを設定します。

    • SCHEDULE [ REFRESH ] CRON cron_string [ AT TIME ZONE timezone_id ]

      指定した場合、ストリーミング テーブルまたは具体化されたビューをスケジュール設定し、指定された quartz cron スケジュールでデータが更新されるようにします。 time_zone_values のみが受け入れられます。 AT TIME ZONE LOCAL はサポートされません。 AT TIME ZONE が存在しない場合は、セッション タイム ゾーンが使用されます。 AT TIME ZONE が存在せず、セッション タイム ゾーンも設定されていない場合は、エラーがスローされます。 SCHEDULE は意味的に SCHEDULE REFRESH と同等です。

      Delta Live Tables パイプライン定義で SCHEDULE 構文を使用することはできません。

    • WITH ROW FILTER 句

      重要

      この機能はパブリック プレビュー段階にあります。

      行フィルター関数をテーブルに追加します。 今後そのテーブルからのすべてのクエリでは、関数が Boolean TRUE に評価される行のサブセットを受け取ります。 これは、特定の行をフィルタリングするかどうかを決定するために呼び出したユーザーの ID やグループ メンバーシップを関数で検査できる、きめ細かいアクセス制御に役立ちます。

  • AS クエリ

    ベース テーブルまたはその他のビューからビューを構築するクエリです。

必要なアクセス許可

具体化されたビュー (MV) を作成するユーザーは、MV の所有者であり、次のアクセス許可が必要です。

  • MV で参照されるベース テーブルに対する SELECT 特権。
  • 親カタログに対する USE CATALOG 権限と親スキーマに対する USE SCHEMA 権限。
  • MV のスキーマに対する CREATE 特権。

ユーザーが MV を更新できるようにするには、次のものが必要です。

  • 親カタログに対する USE CATALOG 権限と親スキーマに対する USE SCHEMA 権限。
  • MV の所有権または MV に対する REFRESH 特権。
  • MV の所有者は、MV で参照されるベース テーブルに対する SELECT 特権を持っている必要があります。

ユーザーが MV のクエリを実行できるようにするには、次のものが必要です。

  • 親カタログに対する USE CATALOG 権限と親スキーマに対する USE SCHEMA 権限。
  • 具体化されたビューに対する SELECT 特権。

行フィルターと列マスク

重要

この機能はパブリック プレビュー段階にあります。

行フィルターを使用すると、テーブル スキャンで行がフェッチされるたびにフィルターとして適用される関数を指定できます。 これらのフィルターにより、後続のクエリでフィルター述語が true と評価される行のみが返されるようになります。

列マスクを使用すると、テーブル スキャンで行がフェッチされるたびに列の値をマスクできます。 その列に関連する今後のすべてのクエリでは、列の元の値を置き換えて、列に対してその関数を評価した結果が返されます。

行フィルターと列マスクの使用方法の詳細については、「行フィルターと列マスクを使って機密性の高いテーブル データをフィルター処理する」を参照してください。

行フィルターと列マスクの管理

具体化されたビューの行フィルターと列マスクは、CREATE ステートメントを通じて追加する必要があります。

Behavior

  • 定義者として更新: REFRESH MATERIALIZED VIEW ステートメントが具体化されたビューを更新すると、行フィルター関数は定義者の権限で (テーブル所有者として) 実行されます。 つまり、テーブルの更新では、具体化されたビューを作成したユーザーのセキュリティ コンテキストが使用されます。
  • クエリ: ほとんどのフィルターは定義者の権限で実行されますが、ユーザー コンテキストをチェックする関数 (CURRENT_USERIS_MEMBER など) は例外です。 これらの関数は呼び出し元として実行されます。 このアプローチでは、現在のユーザーのコンテキストに基づいて、ユーザー固有のデータ セキュリティとアクセス制御が適用されます。
  • 行フィルターと列マスクを含むソース テーブルに対する具体化されたビューを作成する場合、具体化されたビューの更新は常に完全更新になります。 完全更新では、最新の定義を使用して、ソースで使用可能なすべてのデータが再処理されます。 これにより、ソース テーブルのセキュリティ ポリシーが最新のデータと定義に基づいて評価され、適用されるようになります。

可観測性

DESCRIBE EXTENDEDINFORMATION_SCHEMA、またはカタログ エクスプローラーを使用して、特定の具体化されたビューに適用される既存の行フィルターと列マスクを調べます。 この機能により、ユーザーは具体化されたビューのデータ アクセスと保護対策を監査および確認できます。

制限事項

  • NULL 許容列に対する sum 集計を含む具体化されたビューに、その列から削除された最後の非 NULL 値があり、その列に NULL 値のみが残っている場合は、具体化されたビューの集計の結果の値として NULL ではなく 0 が返されます。
  • 列参照には別名は必要ありません。 非列参照式には、次の例のように、別名が必要です。
    • 可能: SELECT col1, SUM(col2) AS sum_col2 FROM t GROUP BY col1
    • 不可: SELECT col1, SUM(col2) FROM t GROUP BY col1
  • 具体化されたビューでは、ID 列や代理キーはサポートされていません。
  • 具体化されたビューでは、アドホック OPTIMIZE および VACUUM コマンドはサポートされていません。 メンテナンスは自動的に行われます。
  • 具体化されたビューでは、PRIMARY KEYFOREIGN KEY などのテーブル制約はサポートされていません。
  • 具体化されたビューでは、データ品質の制約を定義するための期待値はサポートされていません。

-- Create a materialized view if it doesn't exist
> CREATE MATERIALIZED VIEW IF NOT EXISTS subscribed_movies
  AS SELECT mo.member_id, mb.full_name, mo.movie_title
       FROM movies AS mo INNER JOIN members AS mb ON mo.member_id = mb.id;

-- Create and schedule a materialized view to be refreshed daily at midnight.
-- Note: All columns in a GROUP BY need to be explicitly aliased
> CREATE MATERIALIZED VIEW daily_sales
  COMMENT 'Daily sales numbers'
  SCHEDULE CRON '0 0 0 * * ? *'
  AS SELECT date AS date, sum(sales) AS sumOfSales
       FROM table1
       GROUP BY date;

-- Create a materialized view with a row filter and a column mask
> CREATE MATERIALIZED VIEW masked_view (
    id,
    name,
    region,
    ssn MASK catalog.schema.ssn_mask_fn
  )
  WITH ROW FILTER catalog.schema.us_filter_fn ON (region)
  AS SELECT id, name, region, ssn
       FROM employees;