オブジェクトの依存関係

このトピックでは、オブジェクトの依存関係に関する概念と、Account Usageビュー OBJECT_DEPENDENCIES に関連する情報を提供します。

このトピックの内容:

オブジェクトの依存関係とは

オブジェクトの依存関係とは、オブジェクトを操作するために、操作対象のオブジェクトがそれ自体のメタデータを参照するか、少なくとも1つの他のオブジェクトのメタデータを参照する必要があることを意味します。Snowflakeは、Account Usageビュー OBJECT_DEPENDENCIES にあるオブジェクトの依存関係を追跡します。

Snowflakeは、ローカルのSnowflakeアカウントでのオブジェクトの依存関係と、データ共有に関連する特定の依存関係(プロバイダー共有を通じて利用できるテーブルを基にコンシューマーアカウントでビューを作成するなど)をサポートします。共有オブジェクトの依存関係により、データ責任者はデータの整合性を高め、各規制基準をより完全に遵守し、さらに詳細な影響分析を生成できます。

Snowflakeは、依存関係をトリガーできる次の依存関係タイプをサポートしています。オブジェクト name 値、オブジェクト ID 値、およびオブジェクト name 値とオブジェクト ID 値の組み合わせ。

BY_NAME:

BY_NAME 依存関係は、 SQL ステートメントが、オブジェクト自体の name 値を指定する場合(例: CREATE または ALTER コマンド)、またはオブジェクトが、 SQL操作を完了するための別のオブジェクトの値(例: FROM 句)を使用して name 値を呼び出す場合に発生します。

たとえば、次のステートメントを考えます。

create view myview as select * from mytable;
Copy

テーブル namemytable は、テーブルのメタデータです。 myview という名前のビューは、 mytable という名前のテーブルに依存しています。ビューを作成するには、テーブルが存在している必要があります。

Snowflakeは、 myview という名前のビューを 参照しているオブジェクト として参照し、テーブル mytable参照されるオブジェクト として参照します。

BY_ID:

BY_ID 依存関係は、オブジェクトが別のオブジェクトのオブジェクト ID 値を保存するときに発生します。ID 依存関係の1つの例は、ストレージ統合の OBJECT_ID 値を保存する外部ステージです。現在、ストレージ統合オブジェクトの ID 値には、Snowflakeのみがアクセスでき、顧客フェーシングの SQL 操作では表示されません。

create stage my_ext_stage
  url='s3://load/files/'
  storage_integration = myint;
Copy

Snowflakeは、 my_ext_stage という名前の外部ステージを 参照しているオブジェクト と呼び、 myint という名前のストレージ統合を 参照されるオブジェクト と呼びます。

BY_NAME_AND_ID:

一部のSnowflakeオブジェクト(例: マテリアライズドビュー)は、オブジェクト name 値とオブジェクト ID 値の両方に依存しています。これらのオブジェクトは、多くの場合、既存のオブジェクトを置き換える CREATE OR REPLACEステートメント、またはオブジェクトの名前を変更する ALTER ステートメントの結果です。

詳細については、Account Usage OBJECT_DEPENDENCIES ビューの 一般的な使用上の注意 セクションをご参照ください。

サポートされているオブジェクトの依存関係

Snowflakeは、参照しているオブジェクトと参照されるオブジェクトを次のようにサポートしています。

参照しているオブジェクト

参照されるオブジェクト

依存関係の型

ビュー、セキュアビュー、SQL UDF、SQL UDTF、および名前で参照されるその他のオブジェクト

ビュー

セキュアビュー

マテリアライズドビュー

UDF (すべての種類)

UDTF

および名前で参照されるその他のオブジェクト

BY_NAME

外部ステージ

ストリーム

ストレージ統合

テーブル、ビュー、セキュアビュー

BY_ID

外部テーブル

ステージ

BY_ID

マテリアライズドビュー

テーブル、外部テーブル

BY_NAME_AND_ID

Snowflakeは、データ共有のコンテキストで次のオブジェクトのみをサポートすることに注意してください。

参照しているオブジェクト

参照されるオブジェクト

依存関係の型

ビュー、SQL UDF、SQL UDTF

テーブル

セキュアビュー

セキュアマテリアライズドビュー

セキュア UDF およびセキュア UDTF

BY_NAME

マテリアライズドビュー

テーブル

BY_NAME_AND_ID

詳細については、 OBJECT_DEPENDENCIES ビューの 使用上の注意 セクションをご参照ください。

利点

オブジェクトの依存関係を特定することで、次のようにデータ追跡のユースケースに関する洞察を得ることができます。

影響分析:

オブジェクトの依存関係を知ることで、データスチュワードは参照しているオブジェクトと参照されるオブジェクトの関係を識別し、参照されるオブジェクトの更新が参照しているオブジェクトのユーザーに悪影響を与えないようにすることができます。

たとえば、テーブルの所有者は、テーブルに列を追加することを計画しています。テーブル名に基づいて OBJECT_DEPENDENCIES ビューをクエリすると、影響を受けるすべてのオブジェクト(例: ビュー)が返されます。

次に、データスチュワードはアクションの計画を調整して、テーブルとビューの更新のタイミングによって、テーブルから作成されたビューをクエリするユーザーに悪影響を与えるようなクエリの破損が発生しないようにします。

コンプライアンス:

オブジェクトの依存関係は、コンプライアンス担当者が機密データソース(つまり、参照されるオブジェクト)とデータターゲット(つまり参照しているオブジェクト)の間の関係を特定するのに役立ちます。次に、コンプライアンス担当者は、コンプライアンス要件(例: GDPR)に基づいて、参照されるオブジェクトと参照しているオブジェクトを更新する最適な方法を決定できます。

データの整合性:

オブジェクトの依存関係は、データが信頼できるソースからのものであることをアナリスト、科学者、コンプライアンス担当者、その他のビジネスユーザーなどの主要なデータ専門家が確信するのに役立ちます。

制限事項

ビュー 使用上の注意 に加えて、 OBJECT_DEPENDENCIES ビューをクエリするときは次の制限に注意してください。

セッションパラメーター:

Snowflakeは、定義に セッションパラメーター を含むオブジェクトの依存関係を正確に計算できません。これは、セッションパラメーターがコンテキストに応じて異なる値を取る可能性があるためです。

Snowflakeは、ビューと関数の定義でセッション変数を使用しないことをお勧めします。

Snowflakeの実装:

このビューは、Snowflakeの実装に必要な依存関係をキャプチャしません。たとえば、ビューは、別のテーブルのクローンから新しいテーブルを作成するために必要な依存関係を記録しません。

オブジェクトの解決:

ビュー定義が関数を使用してオブジェクトを呼び出し、ビューを作成する場合、またはオブジェクトが別の関数またはビュー内で呼び出される場合、Snowflakeはオブジェクトの依存関係を記録しません。例:

create or replace view v_on_stage_function
as
select *
from T1
where get_presigned_url(@stage1, 'data_0.csv.gz')
is not null;
Copy

この例では、関数 get_presigned_url がステージ stage1 を呼び出します。Snowflakeは、 v_on_stage_function という名前のビューが stage1 という名前のステージに依存していることを記録しません。

破損した依存関係:

依存関係の型の値が BY_NAME_AND_ID で、オブジェクトでの CREATE OR REPLACE または ALTER の操作によってオブジェクトの依存関係が変化した場合、Snowflakeは、これらの操作の以前に限り、オブジェクトの依存関係を記録します。

Snowflakeは、結果が破損した参照であるため、これらの操作の後には、ビュークエリ結果にオブジェクトの依存関係を記録しません。

Snowflake機能とサービスによるオブジェクトの依存関係

外部オブジェクト:

Snowflakeは、Snowflakeオブジェクトのオブジェクト依存関係のみを追跡します。たとえば、SnowflakeオブジェクトがAmazon S3バケットに依存している場合、バケットはSnowflakeオブジェクトではなくAmazonオブジェクトであるため、このビューはバケットへの依存関係を記録しません。

複製:

セカンダリオブジェクトはプライマリオブジェクトに依存しますが、このビューは複製操作による依存関係を記録しません。

データ共有:

プロバイダーアカウントの場合、このビューは、データ共有プロバイダーアカウントにより、データ共有コンシューマーアカウントにある依存オブジェクトを判別することを許可しません。たとえば、データ共有プロバイダーはビューを作成し、ビューを共有します。データ共有プロバイダーは、このビューを使用して、共有ビューから作成されたコンシューマーアカウント内のオブジェクト(例: 新しいテーブルまたはビュー)を判別することはできません。

コンシューマーアカウントの場合、このビューは、データ共有コンシューマーアカウントにより、データ共有プロバイダーアカウントにある依存オブジェクトを判別することを許可しません。たとえば、データ共有コンシューマーアカウントがデータ共有プロバイダーアカウントによって利用可能になった UDF を使用する場合、データ共有コンシューマーは、このビューを使用して、共有 UDF が依存するオブジェクトを識別することはできません。

詳細については、 データ共有の使用上の注意 をご参照ください。

OBJECT_DEPENDENCIES ビューのクエリ

次の例は、これらのユースケースをカバーしています。

  1. 外部テーブルに応じてオブジェクトを表示します。

  2. 影響分析: テーブルによって参照されるオブジェクトを見つけます。

  3. GDPR: 特定のビューのデータソースを検索します。

  4. データ共有。

外部テーブルに応じてオブジェクトを表示する

sales_staging_table という名前の外部テーブルから sales_view という名前のマテリアライズドビューを作成します。

CREATE OR REPLACE MATERIALIZED VIEW sales_view AS SELECT * FROM sales_staging_table;
Copy

共有 SNOWFLAKE データベースのAccount Usageスキーマで、 OBJECT_DEPENDENCIES ビューをクエリします。マテリアライズドビューは referencing_object_name であり、外部テーブルは referenced_object_domain であることに注意してください。

SELECT referencing_object_name, referencing_object_domain, referenced_object_name, referenced_object_domain
FROM snowflake.account_usage.object_dependencies
WHERE referenced_object_name = 'SALES_STAGING_TABLE' and referenced_object_domain = 'EXTERNAL TABLE';
Copy
+-------------------------+---------------------------+------------------------+--------------------------+
| REFERENCING_OBJECT_NAME | REFERENCING_OBJECT_DOMAIN | REFERENCED_OBJECT_NAME | REFERENCED_OBJECT_DOMAIN |
+-------------------------+---------------------------+------------------------+--------------------------+
| SALES_VIEW              | MATERIALIZED VIEW         | SALES_STAGING_TABLE    | EXTERNAL TABLE           |
+-------------------------+---------------------------+------------------------+--------------------------+

影響分析: テーブルによって参照されるオブジェクトを検索する

SALES_NA という名前のベーステーブルについて考えましょう。ここで、 NA は北米を示し、 US は米国を示し、 CAL はカリフォルニアを示し、一連のネストされたビューがあります。

  • (テーブル) SALES_NA » (ビュー) NORTH_AMERICA_SALES » (ビュー) US_SALES

  • (テーブル) SALES_NA » (ビュー) NORTH_AMERICA_SALES » (ビュー) CAL_SALES

テーブルビューとネストされたビューを作成するには、次のコマンドを実行します。

CREATE TABLE sales_na(product string);
CREATE OR REPLACE VIEW north_america_sales AS SELECT * FROM sales_na;
CREATE VIEW us_sales AS SELECT * FROM north_america_sales;
CREATE VIEW cal_sales AS SELECT * FROM north_america_sales;
Copy

同様に、ベーステーブル SALES_NA とそのネストされたビューとの関係を検討し、ベーステーブル SALES_UKUK は英国を示します)とそのネストされたビューとの関係を検討します。

2つの異なるビューが、 GLOBAL_SALES という名前のビューを派生させるソースオブジェクトとして機能することに注意してください。

  • (テーブル) SALES_NA » (ビュー) NORTH_AMERICA_SALES » (ビュー) GLOBAL_SALES

  • (テーブル) SALES_UK » (ビュー) GLOBAL_SALES

これらのネストされたビューを作成するには、次のコマンドを実行します。

CREATE TABLE sales_uk (product string);
CREATE VIEW global_sales AS SELECT * FROM sales_uk UNION ALL SELECT * FROM north_america_sales;
Copy

共有 SNOWFLAKE データベースのAccount Usageスキーマの OBJECT_DEPENDENCIES ビューをクエリして、テーブル SALES_NA のオブジェクト参照を判別します。クエリ結果の4行目に注意してください。これは、テーブル SALES_NA を指定していますが、テーブル SALES_UK を参照していません。

WITH RECURSIVE referenced_cte
(object_name_path, referenced_object_name, referenced_object_domain, referencing_object_domain, referencing_object_name, referenced_object_id, referencing_object_id)
    AS
      (
        SELECT referenced_object_name || '-->' || referencing_object_name as object_name_path,
               referenced_object_name, referenced_object_domain, referencing_object_domain, referencing_object_name, referenced_object_id, referencing_object_id
          FROM snowflake.account_usage.object_dependencies referencing
          WHERE true
            AND referenced_object_name = 'SALES_NA' AND referenced_object_domain='TABLE'

        UNION ALL

        SELECT object_name_path || '-->' || referencing.referencing_object_name,
              referencing.referenced_object_name, referencing.referenced_object_domain, referencing.referencing_object_domain, referencing.referencing_object_name,
              referencing.referenced_object_id, referencing.referencing_object_id
          FROM snowflake.account_usage.object_dependencies referencing JOIN referenced_cte
            ON referencing.referenced_object_id = referenced_cte.referencing_object_id
            AND referencing.referenced_object_domain = referenced_cte.referencing_object_domain
      )

  SELECT object_name_path, referenced_object_name, referenced_object_domain, referencing_object_name, referencing_object_domain
    FROM referenced_cte
;
Copy
+-----------------------------------------------+------------------------+--------------------------+-------------------------+---------------------------+
| OBJECT_NAME_PATH                              | REFERENCED_OBJECT_NAME | REFERENCED_OBJECT_DOMAIN | REFERENCING_OBJECT_NAME | REFERENCING_OBJECT_DOMAIN |
+-----------------------------------------------+------------------------+--------------------------+-------------------------+---------------------------+
| SALES_NA-->NORTH_AMERICA_SALES                | SALES_NA               | TABLE                    | NORTH_AMERICA_SALES     | VIEW                      |
| SALES_NA-->NORTH_AMERICA_SALES-->CAL_SALES    | NORTH_AMERICA_SALES    | VIEW                     | CAL_SALES               | VIEW                      |
| SALES_NA-->NORTH_AMERICA_SALES-->US_SALES     | NORTH_AMERICA_SALES    | VIEW                     | US_SALES                | VIEW                      |
| SALES_NA-->NORTH_AMERICA_SALES-->GLOBAL_SALES | NORTH_AMERICA_SALES    | VIEW                     | GLOBAL_SALES            | VIEW                      |
+-----------------------------------------------+------------------------+--------------------------+-------------------------+---------------------------+

GDPR: 特定のビューのデータソースを検索する

派生オブジェクト(例: ビュー、 CTAS)は、カスタムビューまたはダッシュボードを提供するために、多くの異なるソースオブジェクトから作成できます。GDPR などの規制要件を満たすには、コンプライアンス担当者と監査担当者が、特定のオブジェクトから元のデータソースまでデータを追跡できる必要があります。

たとえば、ビュー GLOBAL_SALES は、2つの異なるベーステーブルをポイントする、2つの異なる依存関係パスから派生しています。

  • (テーブル) SALES_NA » (ビュー) NORTH_AMERICA_SALES » (ビュー) GLOBAL_SALES

  • (テーブル) SALES_UK » (ビュー) GLOBAL_SALES

これらのネストされたビューを作成するには、次のコマンドを実行します。

CREATE TABLE sales_na (product string);
CREATE OR REPLACE VIEW north_america_sales AS SELECT * FROM sales_na;
CREATE TABLE sales_uk (product string);
CREATE VIEW global_sales AS SELECT * FROM sales_uk UNION ALL SELECT * FROM north_america_sales;
Copy

共有 SNOWFLAKE データベースのAccount Usageスキーマで OBJECT_DEPENDENCIES ビューをクエリして、ビュー GLOBAL_SALES のデータソースを見つけます。クエリ結果の各行は、一意のオブジェクトへの依存パスを指定します。

WITH RECURSIVE referenced_cte
(object_name_path, referenced_object_name, referenced_object_domain, referencing_object_domain, referencing_object_name, referenced_object_id, referencing_object_id)
    AS
      (
        SELECT referenced_object_name || '<--' || referencing_object_name AS object_name_path,
               referenced_object_name, referenced_object_domain, referencing_object_domain, referencing_object_name, referenced_object_id, referencing_object_id
          from snowflake.account_usage.object_dependencies referencing
          WHERE true
            AND referencing_object_name = 'GLOBAL_SALES' and referencing_object_domain='VIEW'

        UNION ALL

        SELECT referencing.referenced_object_name || '<--' || object_name_path,
              referencing.referenced_object_name, referencing.referenced_object_domain, referencing.referencing_object_domain, referencing.referencing_object_name,
              referencing.referenced_object_id, referencing.referencing_object_id
          FROM snowflake.account_usage.object_dependencies referencing JOIN referenced_cte
            ON referencing.referencing_object_id = referenced_cte.referenced_object_id
            AND referencing.referencing_object_domain = referenced_cte.referenced_object_domain
      )

  SELECT object_name_path, referencing_object_name, referencing_object_domain, referenced_object_name, referenced_object_domain
    FROM referenced_cte
;
Copy
+-----------------------------------------------+-------------------------+---------------------------+------------------------+--------------------------+
| OBJECT_NAME_PATH                              | REFERENCING_OBJECT_NAME | REFERENCING_OBJECT_DOMAIN | REFERENCED_OBJECT_NAME | REFERENCED_OBJECT_DOMAIN |
+-----------------------------------------------+-------------------------+---------------------------+------------------------+--------------------------+
| SALES_UK<--GLOBAL_SALES                       | GLOBAL_SALES            | VIEW                      | SALES_UK               | TABLE                    |
| NORTH_AMERICA_SALES<--GLOBAL_SALES            | GLOBAL_SALES            | VIEW                      | NORTH_AMERICA_SALES    | VIEW                     |
| SALES_NA<--NORTH_AMERICA_SALES<--GLOBAL_SALES | NORTH_AMERICA_SALES     | VIEW                      | SALES_NA               | TABLE                    |
+-----------------------------------------------+-------------------------+---------------------------+------------------------+--------------------------+

データ共有

次のテーブルを検討します。これは、コンシューマーアカウントの OBJECT_DEPENDENCIES ビューからの抜粋です。

  • V1 はコンシューマーが共有オブジェクトから作成するビューを指定します。

  • S_V1 はプロバイダーが共有するビューを指定します。

  • S_T1 はプロバイダーが共有するテーブルを指定します。

REFERENCING_OBJECT_NAME

REFERENCED_OBJECT_NAME

REFERENCED_OBJECT_DOMAIN

REFERENCED_OBJECT_ID

1

V1

S_V1

TABLE

NULL

2

V1

S_T1

TABLE

NULL

このテーブルについては、次の点に注意してください。

  • プロバイダーが共有から 取り消す S_T1 場合、取り消す前に S_T1 の名前が変更されていない限り、コンシューマーにはローカルビューで S_T1 を指定する行(行2)が引き続き表示されます。

  • プロバイダーがテーブルまたはビューをアカウントでドロップすると、そのテーブルまたはビューは共有に含まれなくなります。テーブルまたはビューはプロバイダーアカウントでのドロップ操作の前に共有されていたため、ローカルコンシューマービューはドロップされたテーブルまたはビューの既存のレコードを保持します。

    コンシューマーは、プロバイダーアカウントのビューの変更を観察できません。