오브젝트 종속성¶
이 항목에서는 오브젝트 종속성에 대한 개념과 Account Usage 뷰 OBJECT_DEPENDENCIES와 관련된 정보를 제공합니다.
이 항목의 내용:
오브젝트 종속성이란 무엇입니까?¶
오브젝트 종속성은 오브젝트에서 작동하기 위해 작동 중인 오브젝트가 자신에 대한 메타데이터를 참조하거나 하나 이상의 다른 오브젝트에 대한 참조 메타데이터를 참조해야 한다는 뜻입니다. Snowflake는 Account Usage 뷰 OBJECT_DEPENDENCIES 에서 오브젝트 종속성을 추적합니다.
Snowflake는 로컬 Snowflake 계정의 오브젝트 종속성과 데이터 공유와 관련된 종속성(예: 공급자 공유를 통해 사용할 수 있는 테이블에서 컨슈머 계정의 뷰 생성)을 지원합니다. 데이터 책임자는 공유 오브젝트의 종속성을 통해 더 우수한 데이터 무결성을 보장하고 각 규제 표준을 더욱더 완전하게 준수하며 보다 자세한 영향 분석을 생성할 수 있습니다.
Snowflake는 종속성을 트리거할 수 있는 오브젝트 name
값, 오브젝트 ID 값 그리고 오브젝트 name
값과 오브젝트 ID 값의 조합과 같은 종속성 유형을 지원합니다.
- BY_NAME:
BY_NAME
종속성은 SQL 문이 오브젝트 자체(예: CREATE 또는 ALTER 명령)의name
값을 지정할 때 또는 오브젝트가 SQL 작업을 완료하기 위해 다른 오브젝트의name
값을 호출할 때(예: FROM 절 사용) 발생합니다.예를 들어, 다음 문을 생각해 보겠습니다.
create view myview as select * from mytable;
테이블
name
값mytable
은 테이블의 메타데이터입니다.myview
라는 뷰는mytable
로 명명된 테이블에 종속적이며, 뷰를 생성하려면 테이블이 있어야 합니다.Snowflake에서는
myview
라는 뷰를 참조하는 오브젝트 로, 테이블mytable
을 참조되는 오브젝트 로 지칭합니다.- BY_ID:
BY_ID
종속성은 오브젝트가 다른 오브젝트의 오브젝트 ID 값을 저장할 때 발생합니다. ID 종속성의 한 예는 저장소 통합의 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
는 영국을 나타냄)와 해당 중첩 뷰의 관계를 생각해 보십시오.
두 가지 다른 뷰가 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
의 오브젝트 참조를 확인합니다. 쿼리 결과의 네 번째 행은 테이블 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
는 두 개의 서로 다른 기본 테이블을 가리키는 두 개의 서로 다른 종속성 경로에서 파생됩니다.
(테이블)
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)을 지정하는 행을 계속 볼 수 있습니다.공급자가 자신의 계정에서 테이블 또는 뷰를 삭제하면 해당 테이블 또는 뷰는 더 이상 공유에 포함되지 않습니다. 공급자 계정에서 삭제 작업 이전에 테이블 또는 뷰가 공유되었으므로 로컬 컨슈머 뷰는 삭제된 테이블 또는 뷰에 대한 기존 레코드를 보존합니다.
컨슈머는 공급자 계정의 뷰 변경 사항을 관찰할 수 없습니다.