오브젝트 종속성

이 항목에서는 오브젝트 종속성에 대한 개념과 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;
Copy

테이블 namemytable 은 테이블의 메타데이터입니다. 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;
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_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;
Copy

공유 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
;
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 는 두 개의 서로 다른 기본 테이블을 가리키는 두 개의 서로 다른 종속성 경로에서 파생됩니다.

  • (테이블) 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)을 지정하는 행을 계속 볼 수 있습니다.

  • 공급자가 자신의 계정에서 테이블 또는 뷰를 삭제하면 해당 테이블 또는 뷰는 더 이상 공유에 포함되지 않습니다. 공급자 계정에서 삭제 작업 이전에 테이블 또는 뷰가 공유되었으므로 로컬 컨슈머 뷰는 삭제된 테이블 또는 뷰에 대한 기존 레코드를 보존합니다.

    컨슈머는 공급자 계정의 뷰 변경 사항을 관찰할 수 없습니다.