オブジェクトの依存関係¶
このトピックでは、オブジェクトの依存関係に関する概念と、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;
テーブル
name
値mytable
は、テーブルのメタデータです。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;
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;
この例では、関数
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 ビューのクエリ¶
次の例は、これらのユースケースをカバーしています。
外部テーブルに応じてオブジェクトを表示します。
影響分析: テーブルによって参照されるオブジェクトを見つけます。
GDPR: 特定のビューのデータソースを検索します。
データ共有。
外部テーブルに応じてオブジェクトを表示する¶
sales_staging_table
という名前の外部テーブルから sales_view
という名前のマテリアライズドビューを作成します。
CREATE OR REPLACE MATERIALIZED VIEW sales_view AS SELECT * FROM sales_staging_table;
共有 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';+-------------------------+---------------------------+------------------------+--------------------------+ | 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;
同様に、ベーステーブル SALES_NA
とそのネストされたビューとの関係を検討し、ベーステーブル SALES_UK
(UK
は英国を示します)とそのネストされたビューとの関係を検討します。
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;
共有 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 ;+-----------------------------------------------+------------------------+--------------------------+-------------------------+---------------------------+ | 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;
共有 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 ;+-----------------------------------------------+-------------------------+---------------------------+------------------------+--------------------------+ | 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)が引き続き表示されます。プロバイダーがテーブルまたはビューをアカウントでドロップすると、そのテーブルまたはビューは共有に含まれなくなります。テーブルまたはビューはプロバイダーアカウントでのドロップ操作の前に共有されていたため、ローカルコンシューマービューはドロップされたテーブルまたはビューの既存のレコードを保持します。
コンシューマーは、プロバイダーアカウントのビューの変更を観察できません。