CREATE DYNAMIC TABLE¶
지정된 쿼리를 기반으로 동적 테이블 을 생성합니다.
이 항목의 내용:
구문¶
CREATE [ OR REPLACE ] [ TRANSIENT ] 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 }
WAREHOUSE = <warehouse_name>
[ REFRESH_MODE = { AUTO | FULL | INCREMENTAL } ]
[ INITIALIZE = { ON_CREATE | ON_SCHEDULE } ]
[ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
[ 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>
베리언트 구문¶
CREATE DYNAMIC TABLE … CLONE¶
데이터를 실제로 복사하지 않고 원본 동적 테이블의 모든 기존 데이터를 포함하고 똑같은 열 정의를 사용하여 새 동적 테이블을 만듭니다. 이 베리언트를 사용하여 과거 특정 시점의 동적 테이블을 복제할 수도 있습니다. 복제 고려 사항 섹션을 참조하십시오.
CREATE [ OR REPLACE ] [ TRANSIENT ] 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>
]
원본 동적 테이블에 클러스터링 키가 있는 경우 복제된 동적 테이블에도 클러스터링 키가 있습니다. 기본적으로, 원본 테이블에 대해 자동 클러스터링이 일시 중단되지 않았더라도 자동 클러스터링은 새 테이블에 대해 일시 중단됩니다.
복제에 대한 세부 정보는 CREATE <오브젝트> … CLONE 을 참조하십시오.
CREATE DYNAMIC ICEBERG TABLE¶
새 동적 Apache Iceberg™ 테이블을 만듭니다. Iceberg 테이블에 대한 자세한 내용은 Apache Iceberg™ 테이블 및 CREATE ICEBERG TABLE(Iceberg 카탈로그로서의 Snowflake) 섹션을 참조하십시오.
CREATE [ OR REPLACE ] DYNAMIC ICEBERG TABLE <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 }
WAREHOUSE = <warehouse_name>
[ EXTERNAL_VOLUME = '<external_volume_name>' ]
[ CATALOG = 'SNOWFLAKE' ]
BASE_LOCATION = '<directory_for_table_files>'
[ REFRESH_MODE = { AUTO | FULL | INCREMENTAL } ]
[ INITIALIZE = { ON_CREATE | ON_SCHEDULE } ]
[ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
[ 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>
사용법과 제한 사항에 대한 자세한 내용은 동적 Apache Iceberg™ 테이블 만들기 섹션을 참조하십시오.
필수 매개 변수¶
name
동적 테이블의 식별자(즉, 이름)를 지정하며, 동적 테이블이 생성되는 스키마에 대해 고유해야 합니다.
또한, 식별자는 알파벳 문자로 시작해야 하며 전체 식별자 문자열을 큰따옴표(예:
"My object"
)로 묶지 않는 한 공백이나 특수 문자를 포함할 수 없습니다. 큰따옴표로 묶인 식별자도 대/소문자를 구분합니다.자세한 내용은 식별자 요구 사항 섹션을 참조하십시오.
TARGET_LAG = { num { seconds | minutes | hours | days } | DOWNSTREAM }
동적 테이블의 지연을 지정합니다.
'num seconds | minutes | hours | days'
동적 테이블의 콘텐츠가 원본 테이블에 대한 업데이트보다 지연되어야 하는 최대 시간을 지정합니다.
예:
동적 테이블의 데이터가 5분 이상 지연되면 안 될 경우
5 minutes
를 지정하십시오.동적 테이블의 데이터가 5시간 이상 지연되면 안 될 경우
5 hours
를 지정하십시오.
동적 테이블이 다른 동적 테이블에 종속되는 경우 최소 목표 지연 시간은 종속된 대상 동적 테이블의 목표 지연 시간보다 크거나 같아야 합니다.
DOWNSTREAM
어떤 동적 테이블에 종속된 동적 테이블을 새로 고칠 때만 해당 동적 테이블을 새로 고치도록 지정합니다.
WAREHOUSE = warehouse_name
동적 테이블을 새로 고치기 위한 컴퓨팅 리소스를 제공하는 웨어하우스의 이름을 지정합니다.
동적 테이블을 만들기 위해 이 웨어하우스에 대한 USAGE 권한이 있는 역할을 사용해야 합니다. 제한 사항과 자세한 내용은 동적 테이블 생성 권한 섹션을 참조하십시오.
AS query
동적 테이블에 포함해야 하는 결과를 보여주는 쿼리를 지정합니다.
선택적 매개 변수¶
TRANSIENT
테이블이 일시적 테이블임을 지정합니다.
영구 동적 테이블과 마찬가지로, 일시적 동적 테이블은 명시적으로 삭제될 때까지 존재하며 적절한 권한이 있는 모든 사용자가 사용할 수 있습니다. 일시적 동적 테이블은 Fail-safe 저장소에 데이터를 보관하지 않으므로 특히 자주 새로 고침하는 테이블의 경우 저장소 비용을 절감하는 데 도움이 됩니다. 이러한 낮은 수준의 내구성으로 인해 일시적 동적 테이블은 영구 테이블과 동일한 수준의 데이터 보호 및 복구가 필요하지 않은 일시적 데이터에 사용하는 것이 가장 좋습니다.
기본값: 값 없음. 동적 테이블은
TRANSIENT
로 선언되지 않으면 영구적입니다.REFRESH_MODE = { AUTO | FULL | INCREMENTAL }
동적 테이블의 새로 고침 모드 를 지정합니다.
동적 테이블을 생성한 후에는 이 속성을 변경할 수 없습니다. 속성을 수정하려면 CREATE OR REPLACE DYNAMIC TABLE 명령으로 동적 테이블을 다시 만드십시오.
AUTO
새로 고침 모드가
AUTO
인 경우 시스템에서는 기본적으로 증분 새로 고침을 적용하려고 시도합니다. 그러나 증분 새로 고침이 지원되지 않거나 올바로 수행될 것으로 예상되지 않을 경우 동적 테이블은 전체 새로 고침을 대신 자동으로 선택합니다. 자세한 내용은 증분 새로 고침에 대한 제한 사항 섹션을 참조하십시오.사용 사례에 가장 적합한 모드를 결정하려면 새로 고침 모드와 자동 권장 사항을 실험해 보십시오. Snowflake 릴리스 전반에서 일관적인 동작을 위해 모든 동적 테이블에서 새로 고침 모드를 명시적으로 설정하십시오.
동적 테이블의 새로 고침 모드를 확인하려면 동적 테이블 새로 고침 모드 보기 섹션을 참조하십시오.
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
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;
각 열에 대해 선택적 설명을 지정할 수 있습니다. 예:
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;
CLUSTER BY ( expr [ , expr , ... ] )
동적 테이블에서 하나 이상의 열 또는 열 식을 클러스터링 키로 지정합니다. 동적 테이블에 대한 클러스터링 키를 지정하기 전에 마이크로 파티션을 이해해야 합니다. 자세한 내용은 Snowflake 테이블 구조 이해하기 섹션을 참조하십시오.
동적 테이블에 클러스터링 키를 사용할 때 다음 사항에 유의하십시오.
열 정의가 필요하며 문에 명시적으로 이를 지정해야 합니다.
기본적으로, 원본 테이블에 대해 자동 클러스터링이 일시 중단되더라도 자동 클러스터링은 새 동적 테이블에 대해 일시 중단되지 않습니다.
클러스터링 키는 모든 테이블에 대해 의도되거나 권장되지 않으며, 일반적으로 매우 큰(예: 멀티 테라바이트 크기의) 테이블에 이점이 있습니다.
CLUSTER BY를 지정하면 생성 시점에 데이터를 클러스터링하지 않고, 대신 CLUSTER BY는 자동 클러스터링을 활용하여 시간이 지남에 따라 데이터를 재클러스터링합니다.
자세한 내용은 클러스터링 키 및 클러스터링된 테이블 섹션을 참조하십시오.
기본값: 값 없음(테이블에 대해 정의된 클러스터링 키가 없음)
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 함수를 호출하십시오.
동적 테이블의 정의에 ORDER BY 를 사용하면 예상치 못한 순서로 정렬된 결과가 나올 수 있습니다. 동적 테이블을 쿼리할 때 ORDER BY를 사용하여 선택한 행이 특정 순서로 반환되도록 할 수 있습니다.
Snowflake는 ORDER BY를 사용하여 동적 테이블에서 선택하는 뷰를 생성하는 기능을 지원하지 않습니다.
일부 식, 절 및 함수는 현재 동적 테이블에서 지원되지 않습니다. 전체 목록은 동적 테이블의 알려진 제한 사항 섹션을 참조하십시오.
고객은 Snowflake 서비스를 사용할 때 개인 데이터(사용자 오브젝트 제외), 민감한 데이터, 수출 통제 대상 데이터 또는 기타 규제 데이터가 메타데이터로 입력되지 않도록 해야 합니다. 자세한 내용은 Snowflake의 메타데이터 필드 섹션을 참조하십시오.
예¶
product
라는 동적 테이블을 만듭니다.
CREATE OR REPLACE DYNAMIC TABLE product TARGET_LAG = '20 minutes' WAREHOUSE = mywh AS SELECT product_id, product_name FROM staging_table;
위의 예에서:
동적 테이블은
staging_table
테이블의product_id
및product_name
열의 쿼리 결과를 구체화합니다.목표 지연 시간은 20분입니다. 즉, 동적 테이블의 데이터가
staging_table
에 있는 데이터보다 20분 이상 오래되지 않은 것이어야 이상적입니다.자동화된 새로 고침 프로세스에서는 웨어하우스
mywh
의 컴퓨팅 리소스를 사용하여 동적 테이블의 데이터를 새로 고칩니다.
my_iceberg_table
에서 읽는 product
라는 동적 Iceberg 테이블을 만듭니다.
CREATE DYNAMIC ICEBERG TABLE product (date TIMESTAMP_NTZ, id NUMBER, content STRING) TARGET_LAG = '20 minutes' WAREHOUSE = mywh EXTERNAL_VOLUME = 'my_external_volume' CATALOG = 'SNOWFLAKE' BASE_LOCATION = 'my_iceberg_table' AS SELECT product_id, product_name FROM staging_table;
다중 열 클러스터링 키로 테이블 만들기:
CREATE DYNAMIC TABLE product (date TIMESTAMP_NTZ, id NUMBER, content VARIANT) TARGET_LAG = '20 minutes' WAREHOUSE = mywh CLUSTER BY (date, id) AS SELECT product_id, product_name FROM staging_table;
테이블이 지정된 타임스탬프의 날짜 및 시간에 정확히 존재했던 대로 동적 테이블 복제:
CREATE DYNAMIC TABLE product_clone CLONE product AT (TIMESTAMP => TO_TIMESTAMP_TZ('04/05/2013 01:02:03', 'mm/dd/yyyy hh24:mi:ss'));