카테고리:

데이터베이스, 스키마 및 공유 DDL , 테이블, 뷰 및 시퀀스 DDL , 데이터 로딩/언로딩 DDL

CREATE <오브젝트> … CLONE

시스템에 있는 기존 오브젝트의 복사본을 만듭니다. 이 명령은 주로 데이터베이스, 스키마, 테이블의 복사본 없는 복제본 을 만드는 데 사용되지만, 다른 스키마 오브젝트(즉, 외부 스테이지, 파일 형식, 시퀀스)의 복제본을 빠르고 쉽게 만드는 데도 사용할 수 있습니다.

이 명령은 CLONE 키워드를 추가한 오브젝트별 CREATE <오브젝트> 명령의 변형입니다.

참고

데이터베이스, 스키마, 비 임시 테이블의 경우, CLONETime Travel 을 사용한 복제를 위한 추가 AT | BEFORE 절을 지원합니다.

이 항목의 내용:

구문

데이터베이스, 스키마, 테이블

CREATE [ OR REPLACE ] { DATABASE | SCHEMA | TABLE } [ IF NOT EXISTS ] <object_name>
  CLONE <source_object_name>
        [ { AT | BEFORE } ( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> } ) ]
  ...

기타 스키마 오브젝트

CREATE [ OR REPLACE ] { STAGE | FILE FORMAT | SEQUENCE | STREAM | TASK } [ IF NOT EXISTS ] <object_name>
  CLONE <source_object_name>
  ...

일반적인 사용법 노트

  • 복제본은 쓰기 가능하고 원본과 무관합니다(즉, 원본 또는 복제본에 대한 변경 사항이 다른 오브젝트에 반영되지 않음).

  • 소스 데이터베이스, 스키마 또는 테이블에 명시적으로 설정된 매개 변수는 소스 컨테이너 또는 하위 오브젝트에서 생성된 모든 복제본에 유지됩니다.

  • 복제본을 만들려면 현재 역할이 원본 오브젝트에 대해 다음 권한을 가져야 합니다.

    테이블

    SELECT

    파이프, 스트림, 작업

    OWNERSHIP

    기타 오브젝트

    USAGE

    또한, 스키마 또는 스키마 내의 오브젝트를 복제하려면 현재 역할에 원본과 복제본 모두의 컨테이너 오브젝트에 대한 필수 권한이 있어야 합니다.

  • 데이터베이스와 스키마의 경우 복제는 재귀적입니다.

    • 데이터베이스를 복제하면 데이터베이스의 모든 스키마와 기타 오브젝트가 복제됩니다.

    • 스키마를 복제하면 스키마에 포함된 오브젝트가 전부 복제됩니다.

    하지만 다음 오브젝트 유형은 복제되지 않습니다.

    • 외부 테이블

    • 내부 (Snowflake) 스테이지

  • 데이터베이스, 스키마, 테이블의 경우 복제본은 다음과 같이 기존 데이터를 수정하거나 새 데이터를 추가하는 작업이 복제본에서 수행될 때까지 오브젝트의 전체 데이터 저장소에 기여하지 않습니다.

    • 복제된 테이블에서 행 추가, 삭제 또는 수정

    • 복제된 스키마에서 채워진 새 테이블 만들기

  • 테이블을 복제하면 원본 테이블의 구조, 데이터 및 기타 특정 속성(예: STAGE FILE FORMAT)이 복제됩니다.

    하지만:

    • 복제된 테이블에는 원본 테이블의 로드 기록이 포함되지 않습니다. 이것의 한 가지 결과는 원본 테이블에 로딩된 데이터 파일을 그 복제본에 다시 로딩할 수 있다는 점입니다.

    • 복제된 테이블이 원본 테이블의 클러스터링 키를 복제하지만, 원본 테이블에 대해 자동 클러스터링이 일시 중단되지 않더라도 새 테이블은 자동 클러스터링이 일시 중단된 상태로 시작합니다.

  • CREATE TABLE … CLONE 구문은 다음과 같이 새 테이블 복제본에 영향을 미치는 COPY GRANTS 키워드를 포함합니다.

    • COPY GRANTS 키워드를 사용하는 경우에는 새로운 오브젝트가 원본 테이블에 부여된 모든 명시적인 액세스 권한을 상속하지만, 스키마의 오브젝트 유형에 대해 정의된 향후 모든 권한 부여를 상속하지는 않습니다.

    • COPY GRANTS 키워드를 사용하지 않는 경우에는 새 오브젝트 복제본이 원본 테이블에 부여된 모든 명시적인 액세스 권한을 상속하지 않지만, (GRANT <권한> … TO ROLE … ON FUTURE 구문을 사용하여) 스키마의 오브젝트 유형에 대해 정의된 향후 모든 권한 부여를 상속합니다.

  • 메타데이터 관련:

    주의

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

  • CREATE OR REPLACE <오브젝트> 문은 원자성입니다. 즉, 오브젝트가 바뀔 때 이전 오브젝트 삭제와 새 오브젝트 생성이 단일 트랜잭션으로 처리됩니다.

오브젝트 복제에 적용되는 추가 규칙

메타데이터

오브젝트 복제본은 CREATE <오브젝트> CLONE 문이 실행될 때 또는 Time Travel 을 사용하여 지정된 시간/과거의 시점에 현재 원본 오브젝트의 이름구조 를 상속합니다. 오브젝트 복제본은 Time Travel의 사용 여부와 관계없이 문이 실행되는 시점에 원본 오브젝트에 있는 설명 또는 테이블 클러스터링 키와 같은 다른 메타데이터를 모두 상속합니다.

하위 오브젝트

데이터베이스 또는 스키마 복제본은 문이 실행될 때 또는 지정된 시간/과거의 시점에 활성 상태인 모든 하위 오브젝트를 포함합니다. 테이블 데이터의 스냅샷은 문이 실행될 때 또는 지정된 시간/과거의 시점에 원본 데이터의 상태를 나타냅니다. 하위 오브젝트는 문이 실행될 때 원본 하위 오브젝트의 이름과 구조를 상속합니다.

복제 안 됨

데이터베이스 또는 스키마를 복제해도 데이터베이스 또는 스키마에서 다음 유형의 오브젝트는 복제되지 않습니다.

  • 외부 테이블

  • 내부 (Snowflake) 스테이지

파이프

데이터베이스 또는 스키마 복제본은 외부(Amazon S3, Google Cloud Storage 또는 Microsoft Azure) 스테이지를 참조하는 파이프 오브젝트만 포함합니다. 내부(Snowflake) 파이프는 복제되지 않습니다.

파이프 복제본의 기본 상태는 다음과 같습니다.

  • AUTO_INGEST = FALSE 일 때는 복제된 파이프가 기본적으로 일시 중지됩니다.

  • AUTO_INGEST = TRUE 일 때는 복제된 파이프가 STOPPED_CLONED 상태로 설정됩니다. 이 상태에서 파이프는 새로 스테이징된 파일의 결과로 이벤트 알림을 누적하지 않습니다. 파이프가 명시적으로 다시 시작될 때, 새 이벤트 알림의 결과로 트리거된 데이터 파일만 처리합니다.

어느 한 상태의 파이프 복제는 ALTER PIPE … RESUME 문을 실행하여 다시 시작할 수 있습니다.

태그

데이터베이스 또는 스키마 복제는 해당 데이터베이스 또는 스키마의 태그 에 다음과 같이 영향을 줍니다.

  • 원본 오브젝트(예: 테이블)의 태그 연결은 복제된 오브젝트에서 유지 관리됩니다.

  • 데이터베이스 또는 스키마의 경우:

    해당 데이터베이스 또는 스키마에 저장된 태그도 복제됩니다.

    데이터베이스 또는 스키마가 복제되면 해당 스키마 또는 데이터베이스에 있는 태그도 복제됩니다.

    테이블 또는 뷰가 원본 스키마/데이터베이스에 존재하고 같은 스키마 또는 데이터베이스의 태그에 대한 참조가 있는 경우, 복제된 테이블 또는 뷰가 원본 스키마 또는 데이터베이스의 태그 대신 (대상 스키마/데이터베이스에서) 복제된 해당 태그에 매핑됩니다.

테이블 데이터

데이터베이스, 스키마 또는 테이블을 복제할 때 각 테이블에 있는 데이터의 스냅샷이 생성되고 복제본에 사용할 수 있습니다. 스냅샷은 (Time Travel 을 사용하여) 문이 실행될 때 또는 지정된 시간/과거의 시점에 원본 데이터의 상태를 나타냅니다.

오브젝트 참조

뷰, 스트림, 작업과 같은 오브젝트는 그 정의상 오브젝트 참조를 포함합니다. 예를 들어, 뷰에는 테이블 참조를 포함하는 저장된 쿼리가 있습니다. 스트림은 원본 테이블을 가리킵니다. 작업은 저장 프로시저를 호출하거나 다른 오브젝트를 참조하는 SQL 문을 실행합니다. 그 밖에도 다양한 기능이 있습니다.

이러한 오브젝트 중 하나가 복제된 데이터베이스나 스키마에 복제되거나 개별 오브젝트로 복제될 때, 복제를 지원하는 오브젝트 유형에 대해 복제본은 원본 오브젝트의 정의에서 다른 오브젝트에 대한 참조를 상속합니다. 예를 들어 뷰의 복제본은 쿼리의 테이블 참조를 포함하여 원본 뷰에서 저장된 쿼리를 상속합니다.

원본 오브젝트의 정의에 있는 오브젝트 이름이 완전히 정규화되었는지 부분적으로 정규화되었는지 여부에 각별히 주의하십시오. 완전히 정규화된 이름은 데이터베이스 이름과 스키마 이름을 포함합니다. 원본 오브젝트의 복제본은 자체 정의에 이러한 부분을 포함합니다.

예:

-- Create a schema to serve as the source for a cloned schema.
CREATE SCHEMA source;

-- Create a table.
CREATE TABLE mytable (col1 string, col2 string);

-- Create a view that references the table with a fully-qualified name.
CREATE VIEW myview AS SELECT col1 FROM source.mytable;

-- Retrieve the DDL for the source schema.
SELECT GET_DDL ('schema', 'source', true);

+--------------------------------------------------------------------------+
| GET_DDL ('SCHEMA', 'SOURCE', TRUE)                                       |
|--------------------------------------------------------------------------|
| create or replace schema MPETERS_DB.SOURCE;                              |
|                                                                          |
| create or replace TABLE MPETERS_DB.SOURCE.MYTABLE (                      |
|   COL1 VARCHAR(16777216),                                                                                                                                                     |
|   COL2 VARCHAR(16777216)                                                                                                                                                     |
| );                                                                       |
|                                                                          |
| CREATE VIEW MPETERS_DB.SOURCE.MYVIEW AS SELECT col1 FROM source.mytable; |
|                                                                          |
+--------------------------------------------------------------------------+

-- Clone the source schema.
CREATE SCHEMA source_clone CLONE source;

-- Retrieve the DDL for the clone of the source schema.
-- The clone of the view references the source table with the same fully-qualified name
-- as in the view in the source schema.
SELECT GET_DDL ('schema', 'source_clone', true);

+--------------------------------------------------------------------------------+
| GET_DDL ('SCHEMA', 'SOURCE_CLONE', TRUE)                                       |
|--------------------------------------------------------------------------------|
| create or replace schema MPETERS_DB.SOURCE_CLONE;                              |
|                                                                                |
| create or replace TABLE MPETERS_DB.SOURCE_CLONE.MYTABLE (                      |
|   COL1 VARCHAR(16777216),                                                                                                                                                   |
|   COL2 VARCHAR(16777216)                                                                                                                                                   |
| );                                                                             |
|                                                                                |
| CREATE VIEW MPETERS_DB.SOURCE_CLONE.MYVIEW AS SELECT col1 FROM source.mytable; |
|                                                                                |
+--------------------------------------------------------------------------------+

어떤 뷰가 다른 데이터베이스나 스키마에서 같은 이름을 가진 테이블을 가리키도록 하려면 기존 뷰를 복제하는 대신 새 뷰를 만드는 것이 좋습니다. 이 지침은 정의에서 오브젝트를 참조하는 다른 오브젝트에도 적용됩니다.

참고

  • 복제 작업에는 특정한 제한 사항이 적용됩니다. 예를 들어, 복제 작업 중 원본 오브젝트에 영향을 미치는 DDL 문이 결과를 변경하거나 오류를 일으킬 수 있습니다.

  • 복제는 특히 큰 오브젝트(데이터베이스, 스키마, 테이블)의 경우 즉각 이루어지지는 않으며 복제 중인 오브젝트가 잠기지 않습니다. 이와 같이, 해당되는 경우 복제 작업이 계속 실행 중인 동안 복제는 테이블 데이터에 적용된 DML 문을 반영하지 않습니다.

복제 작업에 영향을 줄 수 있는 이 사용 사례와 기타 사용 사례에 대한 자세한 내용은 복제 고려 사항 을 참조하십시오.

Time Travel을 사용한 복제 참고 사항(데이터베이스, 스키마, 테이블만 해당)

  • AT | BEFORE 절은 과거의 지정된 시간 또는 지정된 SQL 문을 기준으로 데이터베이스, 스키마 또는 테이블을 복제합니다.

    • AT 키워드는 지정된 매개 변수와 동일한 타임스탬프를 갖는 문 또는 트랜잭션에 의해 수행된 모든 변경 사항을 요청이 포함하도록 지정합니다.

    • BEFORE 키워드는 요청이 지정된 매개 변수 바로 앞의 지점을 참조하도록 지정합니다.

  • STATEMENT 를 사용한 복제는 지정된 문 ID로 식별되는 SQL 문(또는 이를 둘러싸는 트랜잭션)의 기록된 실행 시간과 같은 값을 가진 TIMESTAMP 를 사용하는 것과 같습니다.

  • 다음 경우에 오류가 반환됩니다.

    • 복제 중인 오브젝트가 AT | BEFORE 절에 지정된 과거 시점에 존재하지 않았던 경우.

    • 복제 중인 오브젝트 또는 그 오브젝트의 하위 오브젝트(예: 복제된 스키마 또는 데이터베이스에 있는 테이블)를 복제하는 데 필요한 레코드 데이터가 제거된 경우.

  • 복제된 데이터베이스 또는 스키마의 하위 오브젝트가 AT | BEFORE 절에 지정된 과거 시점에 존재하지 않은 경우에는 하위 오브젝트가 복제되지 않습니다.

자세한 내용은 Time Travel 이해 및 사용하기 섹션을 참조하십시오.

데이터베이스와 데이터베이스 내의 모든 오브젝트를 현재 상태에서 복제:

CREATE DATABASE mytestdb_clone CLONE mytestdb;

스키마와 스키마 내의 모든 오브젝트를 현재 상태에서 복제:

CREATE SCHEMA mytestschema_clone CLONE testschema;

테이블을 현재 상태에서 복제:

CREATE TABLE orders_clone CLONE orders;

스키마가 지정된 타임스탬프의 날짜 및 시간 이전에 존재했던 대로 스키마 복제:

CREATE SCHEMA mytestschema_clone_restore CLONE testschema BEFORE (TIMESTAMP => TO_TIMESTAMP(40*365*86400));

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

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

지정된 문(즉, 쿼리 ID)을 실행하기 직전에 존재했던 대로 테이블 복제:

CREATE TABLE orders_clone_restore CLONE orders BEFORE (STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726');
맨 위로 이동