CREATE DYNAMIC TABLE

지정된 쿼리를 기반으로 동적 테이블 을 생성합니다.

참고 항목:

ALTER DYNAMIC TABLE, DESCRIBE DYNAMIC TABLE, DROP DYNAMIC TABLE , SHOW DYNAMIC TABLES

이 항목의 내용:

구문

CREATE [ OR REPLACE ] DYNAMIC TABLE [ IF NOT EXISTS ] <name> (
    -- Column definition
    <col_name> <col_type>
      [ [ WITH ] MASKING POLICY <policy_name> [ USING ( <col_name> , <cond_col1> , ... ) ] ]
      [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
      [ COMMENT '<string_literal>' ]

    -- Additional column definitions
    [ , <col_name> <col_type> [ ... ] ]

  )
  TARGET_LAG = { '<num> { seconds | minutes | hours | days }' | DOWNSTREAM }
  REFRESH_MODE = { AUTO | FULL | INCREMENTAL }
  INITIALIZE = { ON_CREATE | ON_SCHEDULE }
  WAREHOUSE = <warehouse_name>
  [ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
  [ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
  [ COMMENT = '<string_literal>' ]
  [ [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
  [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
  AS <query>
Copy

베리언트 구문

CREATE DYNAMIC TABLE … CLONE

데이터를 실제로 복사하지 않고 원본 동적 테이블의 모든 기존 데이터를 포함하고 똑같은 열 정의를 사용하여 새 동적 테이블을 만듭니다. 이 베리언트를 사용하여 과거 특정 시점의 동적 테이블을 복제할 수도 있습니다. 복제 고려 사항 섹션을 참조하십시오.

CREATE [ OR REPLACE ] DYNAMIC TABLE <name>
  CLONE <source_dynamic_table>
        [ { AT | BEFORE } ( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> } ) ]
  [
    COPY GRANTS
    TARGET_LAG = { '<num> { seconds | minutes | hours | days }' | DOWNSTREAM }
    WAREHOUSE = <warehouse_name>
  ]
Copy

복제에 대한 세부 정보는 CREATE <오브젝트> … CLONE 을 참조하십시오.

필수 매개 변수

name

동적 테이블의 식별자(즉, 이름)를 지정하며, 동적 테이블이 생성되는 스키마에 대해 고유해야 합니다.

또한, 식별자는 알파벳 문자로 시작해야 하며 전체 식별자 문자열을 큰따옴표(예: "My object")로 묶지 않는 한 공백이나 특수 문자를 포함할 수 없습니다. 큰따옴표로 묶인 식별자도 대/소문자를 구분합니다.

자세한 내용은 식별자 요구 사항 섹션을 참조하십시오.

TARGET_LAG = { num { seconds | minutes | hours | days } | DOWNSTREAM }

동적 테이블의 지연을 지정합니다.

'num seconds | minutes | hours | days'

동적 테이블의 콘텐츠가 기본 테이블에 대한 업데이트보다 지연되어야 하는 최대 시간을 지정합니다.

예:

  • 동적 테이블의 데이터가 5분 이상 지연되면 안 될 경우 5 minutes 를 지정하십시오.

  • 동적 테이블의 데이터가 5시간 이상 지연되면 안 될 경우 5 hours 를 지정하십시오.

최소값은 1분입니다. 동적 테이블 A가 다른 동적 테이블 B에 종속된 경우 A의 최소 지연은 B의 지연보다 크거나 같아야 합니다.

DOWNSTREAM

어떤 동적 테이블에 종속된 동적 테이블을 새로 고칠 때만 해당 동적 테이블을 새로 고치도록 지정합니다.

REFRESH_MODE = { AUTO | FULL | INCREMENTAL }

동적 테이블의 새로 고침 유형 을 지정합니다. 동적 테이블을 생성한 후에는 이 속성을 변경할 수 없습니다. 속성을 수정하려면 CREATE OR REPLACE DYNAMIC TABLE 명령으로 동적 테이블을 복제하십시오.

AUTO

기본적으로 동적 테이블의 증분 새로 고침을 적용합니다. CREATE DYNAMIC TABLE 문이 증분 새로 고침 모드를 지원하지 않으면 전체 새로 고침 모드를 사용하여 동적 테이블이 자동으로 생성됩니다.

SHOW DYNAMIC TABLES 문을 사용하여 새로 고침 모드를 확인할 수 있습니다. refresh_mode 열에는 사용 중인 새로 고침 모드가 표시되고, text 열에는 사용자가 지정한 새로 고침 모드가 표시됩니다.

FULL

동적 테이블을 증분식으로 새로 고칠 수 있더라도 동적 테이블의 전체 새로 고침을 적용합니다.

INCREMENTAL

동적 테이블의 증분 새로 고침을 적용합니다. 동적 테이블의 기초가 되는 쿼리가 증분 새로 고침을 수행할 수 없는 경우 동적 테이블 생성이 실패하고 오류 메시지가 표시됩니다.

기본값: AUTO

INITIALIZE

동적 테이블의 초기 새로 고침 동작을 지정합니다. 동적 테이블을 생성한 후에는 이 속성을 변경할 수 없습니다. 속성을 수정하려면 CREATE OR REPLACE DYNAMIC TABLE 명령으로 동적 테이블을 대체하십시오.

ON_CREATE

생성 시 동적 테이블을 동기식으로 새로 고칩니다. 이 새로 고침이 실패하면 동적 테이블 생성이 실패하고 오류 메시지가 표시됩니다.

ON_SCHEDULE

다음 예약된 새로 고침 시 동적 테이블을 새로 고칩니다.

새로 고침 일정 프로세스가 실행되면 동적 테이블이 채워집니다. 동적 테이블이 생성될 때 데이터가 채워지지 않습니다. SELECT * FROM DYNAMIC TABLE 을 사용하여 테이블을 쿼리하려고 하면 예약된 첫 번째 새로 고침이 아직 발생하지 않았으므로 다음 오류가 표시될 수 있습니다.

Dynamic Table is not initialized. Please run a manual refresh or wait for a scheduled refresh before querying.

기본값: ON_CREATE

WAREHOUSE = warehouse_name

동적 테이블을 새로 고치기 위한 컴퓨팅 리소스를 제공하는 웨어하우스의 이름을 지정합니다.

동적 테이블을 만들기 위해 이 웨어하우스에 대한 USAGE 권한이 있어야 합니다.

AS query

동적 테이블에 포함해야 하는 결과를 보여주는 쿼리를 지정합니다.

선택적 매개 변수

COMMENT 'string_literal'

열에 대한 설명을 지정합니다.

(열 수준 또는 테이블 수준에서 설명을 지정할 수 있습니다. 각 설명에 대한 구문은 약간 다릅니다.)

MASKING POLICY = policy_name

열에 설정할 마스킹 정책 을 지정합니다.

column_list

열 이름을 변경하거나 동적 테이블의 열에 설명을 추가하려면 열 이름을 지정하는 열 목록과 필요한 경우 열에 대한 설명을 포함하십시오. 열의 데이터 타입을 지정할 필요가 없습니다.

동적 테이블의 열이 식을 기반으로 하는 경우(예: 단순한 열 이름) 동적 테이블의 각 열에 대한 열 이름을 입력해야 합니다. 예를 들어 다음과 같은 경우에는 열 이름이 필요합니다.

CREATE DYNAMIC TABLE product (pre_tax_profit, taxes, after_tax_profit)
  TARGET_LAG = '20 minutes'
    WAREHOUSE = mywh
    AS
      SELECT revenue - cost, (revenue - cost) * tax_rate, (revenue - cost) * (1.0 - tax_rate)
      FROM staging_table;
Copy

각 열에 대해 선택적 설명을 지정할 수 있습니다. 예:

CREATE DYNAMIC TABLE product (pre_tax_profit COMMENT 'revenue minus cost',
                taxes COMMENT 'assumes taxes are a fixed percentage of profit',
                after_tax_profit)
  TARGET_LAG = '20 minutes'
    WAREHOUSE = mywh
    AS
      SELECT revenue - cost, (revenue - cost) * tax_rate, (revenue - cost) * (1.0 - tax_rate)
      FROM staging_table;
Copy
DATA_RETENTION_TIME_IN_DAYS = integer

동적 테이블에서 레코드 데이터에 대해 Time Travel 작업(SELECT, CLONE)을 수행할 수 있도록 동적 테이블의 보존 기간을 지정합니다. Time Travel은 기존 테이블의 경우와 마찬가지로 동적 테이블에서도 똑같이 동작합니다. 자세한 내용은 Time Travel 이해 및 사용하기 섹션을 참조하십시오.

이 오브젝트 수준 매개 변수에 대한 자세한 설명과 아울러 오브젝트 매개 변수에 대한 자세한 내용은 매개 변수 를 참조하십시오.

값:

  • Standard Edition: 0 또는 1

  • Enterprise Edition:

    • 영구 테이블의 경우 0 ~ 90

    • 임시 테이블과 일시적 테이블의 경우 0 또는 1

기본값:

  • Standard Edition: 1

  • Enterprise Edition 또는 그 이상: 1 (스키마, 데이터베이스 또는 계정 수준에서 다른 기본값이 지정되지 않은 경우)

참고

0 의 값은 테이블의 Time Travel을 효과적으로 비활성화합니다.

MAX_DATA_EXTENSION_TIME_IN_DAYS = integer

Snowflake가 동적 테이블의 스트림이 부실해지는 것을 방지하기 위해 동적 테이블의 데이터 보존 기간을 연장할 수 있는 최대 일수를 지정하는 오브젝트 매개 변수입니다.

이 매개 변수에 대한 자세한 설명은 MAX_DATA_EXTENSION_TIME_IN_DAYS 섹션을 참조하십시오.

COMMENT = 'string_literal'

동적 테이블에 대한 설명을 지정합니다.

(열 수준 또는 테이블 수준에서 설명을 지정할 수 있습니다. 각 설명에 대한 구문은 약간 다릅니다.)

기본값: 값 없음.

COPY GRANTS

CREATE DYNAMIC TABLE … CLONE 베리언트를 사용하여 새 동적 테이블을 만들 때 원본 동적 테이블의 액세스 권한을 유지하도록 지정합니다.

이 매개 변수는 OWNERSHIP을 제외한 모든 권한을 기존 동적 테이블에서 새 동적 테이블로 복사합니다. 새 동적 테이블은 스키마의 오브젝트 유형에 대해 정의된 향후 모든 권한 부여를 상속하지는 않습니다. 기본적으로, CREATE DYNAMIC TABLE 문을 실행하는 역할은 새 동적 테이블을 소유합니다.

CREATE DYNAMIC TABLE 문에 이 매개 변수가 포함되지 않은 경우에는 새 테이블이 원본 동적 테이블에 부여된 모든 명시적인 액세스 권한을 상속하지 않지만, 스키마의 오브젝트 유형에 대해 정의된 향후 모든 권한 부여를 상속하지는 않습니다.

참고:

  • 데이터 공유 사용 시:

    • 기존 동적 테이블을 다른 계정과 공유한 경우 대체 동적 테이블도 공유됩니다.

    • 기존 동적 테이블을 데이터 컨슈머로서 자신의 계정과 공유하고 (부모 데이터베이스에서 GRANT IMPORTED PRIVILEGES 를 사용하여) 계정의 다른 역할에 추가로 액세스 권한을 부여한 경우 대체 동적 테이블에도 액세스 권한이 부여됩니다.

  • 대체 동적 테이블에 대한 SHOW GRANTS 출력에는 CREATE TABLE 문이 실행될 때 현재 타임스탬프를 포함한 이 문을 실행한 역할로서 복사된 권한의 피부여자가 나열됩니다.

  • 대체 동적 테이블에 대한 SHOW GRANTS 출력에는 CREATE TABLE 문이 실행될 때 현재 타임스탬프를 포함한 이 문을 실행한 역할로서 복사된 권한의 피부여자가 나열됩니다.

  • 권한 부여 복사 작업은 CREATE DYNAMIC TABLE 명령에서 원자적으로(즉, 같은 트랜잭션 내에서) 발생합니다.

ROW ACCESS POLICY policy_name ON ( col_name [ , col_name ... ] )

동적 테이블에 설정할 행 액세스 정책 을 지정합니다.

TAG ( tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] )

태그 이름과 태그 문자열 값을 지정합니다.

태그 값은 항상 문자열이며, 태그 값의 최대 문자 수는 256자입니다.

문에서 태그를 지정하는 방법에 대한 자세한 내용은 오브젝트 및 열에 대한 태그 할당량 섹션을 참조하십시오.

액세스 제어 요구 사항

이 SQL 명령을 실행하는 데 사용되는 역할 에는 최소한 다음 권한 이 있어야 합니다.

권한

오브젝트

참고

CREATE DYNAMIC TABLE

동적 테이블을 만들려는 스키마입니다.

SELECT

새 동적 테이블에 대해 쿼리하려는 테이블, 뷰 및 동적 테이블입니다.

USAGE

테이블을 새로 고치는 데 사용하려는 웨어하우스입니다.

스키마의 모든 오브젝트에 대해 작업하려면 상위 데이터베이스 및 스키마에 대한 USAGE 권한도 필요합니다.

지정된 권한 세트로 사용자 지정 역할을 만드는 방법에 대한 지침은 사용자 지정 역할 만들기 섹션을 참조하십시오.

보안 오브젝트 에 대해 SQL 작업을 수행하기 위한 역할과 권한 부여에 대한 일반적인 정보는 액세스 제어의 개요 섹션을 참조하십시오.

사용법 노트

  • CREATE DYNAMIC TABLE 명령을 실행하면 현재 사용 중인 역할이 동적 테이블의 소유자가 됩니다. 이 역할은 백그라운드에서 동적 테이블 새로 고침을 수행하는 데 사용됩니다.

  • 동적 테이블을 만든 후에는 스키마를 변경할 수 없습니다.

  • 기본 데이터베이스 오브젝트가 변경되면 동적 테이블이 업데이트됩니다. 동적 테이블에서 사용하는 모든 기본 오브젝트에서 변경 내용 추적을 활성화해야 합니다. 변경 내용 추적 활성화 섹션을 참조하십시오.

  • 기존 동적 테이블을 교체하려는데 현재 정의를 확인해야 하는 경우 GET_DDL 함수를 호출하십시오.

  • 일부 식, 절 및 함수는 현재 동적 테이블에서 지원되지 않습니다. 전체 목록은 동적 테이블의 알려진 제한 사항 섹션을 참조하십시오.

  • 고객은 Snowflake 서비스를 사용할 때 개인 데이터(사용자 오브젝트 제외), 민감한 데이터, 수출 통제 대상 데이터 또는 기타 규제 데이터가 메타데이터로 입력되지 않도록 해야 합니다. 자세한 내용은 Snowflake의 메타데이터 필드 섹션을 참조하십시오.

product 라는 동적 테이블을 만듭니다.

CREATE OR REPLACE DYNAMIC TABLE product
 TARGET_LAG = '20 minutes'
  WAREHOUSE = mywh
  AS
    SELECT product_id, product_name FROM staging_table;
Copy

위의 예에서:

  • 동적 테이블은 staging_table 테이블의 product_idproduct_name 열의 쿼리 결과를 구체화합니다.

  • 목표 지연 시간은 20분입니다. 즉, 동적 테이블의 데이터가 staging_table 에 있는 데이터보다 20분 이상 오래되지 않은 것이어야 이상적입니다.

  • 자동화된 새로 고침 프로세스에서는 웨어하우스 mywh 의 컴퓨팅 리소스를 사용하여 동적 테이블의 데이터를 새로 고칩니다.

테이블이 지정된 타임스탬프의 날짜 및 시간에 정확히 존재했던 대로 동적 테이블 복제:

CREATE DYNAMIC TABLE orders_clone_restore CLONE orders AT (TIMESTAMP => TO_TIMESTAMP_TZ('04/05/2013 01:02:03', 'mm/dd/yyyy hh24:mi:ss'));
Copy