CREATE <오브젝트> … CLONE

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

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

Time Travel을 사용하여 오브젝트 복제하기

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

데이터베이스 및 스키마의 경우 CLONE 은 Time Travel에서 삭제된 테이블을 건너뛰는 IGNORE TABLES WITH INSUFFICIENT DATA RETENTION 매개 변수를 지원합니다(예: 데이터 보존 기간이 1일인 일시적 테이블).

구문

데이터베이스, 스키마

CREATE [ OR REPLACE ] { DATABASE | SCHEMA } [ IF NOT EXISTS ] <object_name>
  CLONE <source_object_name>
        [ { AT | BEFORE } ( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> } ) ]
        [ IGNORE TABLES WITH INSUFFICIENT DATA RETENTION ]
  ...
Copy

테이블

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

동적 테이블

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

데이터베이스 역할

CREATE [ OR REPLACE ] DATABASE ROLE [ IF NOT EXISTS ] <database_role_name>
  CLONE <source_database_role_name>
Copy

기타 스키마 오브젝트

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

Time Travel 매개 변수

{ AT | BEFORE } ( { TIMESTAMP => timestamp | OFFSET => time_difference | STATEMENT => id } )

AT | BEFORE 절은 다음 매개 변수 중 하나를 허용합니다.

TIMESTAMP => timestamp

Time Travel에 사용할 정확한 날짜와 시간을 지정합니다. 값은 명시적으로 TIMESTAMP에 캐스팅되어야 합니다.

OFFSET => time_difference

Time Travel에 사용할 현재 시간과의 초 단위 차이를 -N 형식으로 지정합니다. 여기서 N 은 정수 또는 산술 식일 수 있습니다(예: -120 은 120초, -30*60 은 1800초 또는 30분).

STATEMENT => id

Time Travel의 기준점으로 사용할 문의 쿼리 ID를 지정합니다. 이 매개 변수는 다음 형식 중 하나의 문을 지원합니다.

  • DML(예: INSERT, UPDATE, DELETE)

  • TCL(BEGIN, COMMIT 트랜잭션)

  • SELECT

쿼리 ID는 지난 14일 이내에 실행된 쿼리를 참조해야 합니다. 쿼리 ID가 14일이 지난 쿼리를 참조하는 경우 다음 오류가 반환됩니다.

Error: statement <query_id> not found

이 제한을 해결하려면 참조된 쿼리에 대한 타임스탬프를 사용하십시오.

IGNORE TABLES WITH INSUFFICIENT DATA RETENTION

Time Travel에서 더 이상 복제할 수 있는 기록 데이터가 없는 테이블은 무시합니다. AT | BEFORE 절에 지정된 과거의 시간이 데이터베이스 또는 스키마의 하위 테이블에 대한 데이터 보존 기간을 초과한 경우 하위 테이블에 대한 복제 작업을 건너뛰십시오. 자세한 내용은 하위 오브젝트 및 데이터 보존 시간 을 참조하십시오.

일반적인 사용법 노트

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

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

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

    데이터베이스 역할

    데이터베이스 역할에 대한 OWNERSHIP과 대상 데이터베이스에 대한 CREATE DATABASE ROLE 권한.

    테이블

    SELECT

    경고, 파이프, 스트림, 작업

    OWNERSHIP

    기타 오브젝트

    USAGE

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

  • 데이터베이스 역할:

    • CREATE CLONE 명령을 실행하여 데이터베이스 또는 데이터베이스에 포함된 다른 오브젝트를 복제할 때 데이터베이스 역할은 복제되지 않습니다. 데이터베이스 역할을 대상 데이터베이스에 복제하려면 CREATE DATABASE ROLE … CLONE 명령을 사용해야 합니다.

    • 데이터베이스 역할이 대상 데이터베이스에 이미 복제된 경우 이 명령은 실패합니다. 이런 경우에는 대상 데이터베이스에서 데이터베이스 역할을 삭제하고 CLONE 명령을 다시 시도하십시오.

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

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

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

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

    • 외부 테이블

    • 내부 (Snowflake) 스테이지

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

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

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

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

    하지만:

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

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

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

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

    • COPY GRANTS 키워드를 사용하지 않는 경우에는 새 오브젝트 복제본이 원본 테이블에 부여된 모든 명시적인 액세스 권한을 상속하지 않지만, (GRANT <권한> … 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; |
|                                                                                |
+--------------------------------------------------------------------------------+
Copy

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

참고

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

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

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

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

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

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

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

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

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

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

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

      Time Travel에서 삭제된 하위 오브젝트에 대한 해결 방법으로 CREATE <object> … CLONE 명령의 IGNORE TABLES WITH INSUFFICIENT DATA RETENTION 매개 변수를 사용하십시오. 자세한 내용은 하위 오브젝트 및 데이터 보존 시간 섹션을 참조하십시오.

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

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

Time Travel을 사용하여 오브젝트 복제 문제 해결하기

다음 시나리오는 Time Travel을 사용하여 오브젝트를 복제할 때 발생할 수 있는 문제를 해결하는 데 도움이 될 수 있습니다.

오류 

000707 (02000): Time travel data is not available for <object_type>
<object_name>. The requested time is either beyond the allowed time
travel period or before the object creation time.

이 오류는 다음과 같은 이유로 반환될 수 있습니다.

원인

AT | BEFORE 절로 지정한 과거의 시간이 오브젝트의 데이터 보존 기간을 초과했습니다.

해결책

적절한 SHOW <오브젝트> 명령과 retention_time 열을 사용하여 오브젝트의 데이터 보존 기간을 확인합니다. 오브젝트의 데이터 보존 기간 내에 있는 과거의 시간을 사용하도록 CREATE <object> … CLONE 문을 업데이트합니다.

원인

하위 오브젝트의 기록 데이터가 Time Travel 외부로 이동된 경우 데이터베이스 또는 스키마에 대한 복제 작업이 실패합니다.

해결책

Time Travel에서 더 이상 사용할 수 있는 기록 데이터가 없는 하위 테이블을 건너뛰려면 IGNORE TABLES WITH INSUFFICIENT DATA RETENTION 매개 변수를 사용하는 복제 문을 실행하여 이러한 테이블을 건너뛰십시오.

원인

어떤 경우에는 이는 타임스탬프가 필요한 문자열을 사용하여 발생합니다.

해결책

문자열을 타임스탬프로 캐스팅합니다.

... AT(TIMESTAMP => '2023-12-31 12:00:00')               -- fails
... AT(TIMESTAMP => '2023-12-31 12:00:00'::TIMESTAMP)    -- succeeds
Copy

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

CREATE DATABASE mytestdb_clone CLONE mytestdb;
Copy

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

CREATE SCHEMA mytestschema_clone CLONE testschema;
Copy

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

CREATE TABLE orders_clone CLONE orders;
Copy

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

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

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

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

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

CREATE TABLE orders_clone_restore CLONE orders BEFORE (STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726');
Copy

4일 전에 존재했던 데이터베이스와 모든 오브젝트를 복제하고 데이터 보존 기간이 4일 미만인 테이블을 건너뜁니다.

CREATE DATABASE restored_db CLONE my_db
  AT (TIMESTAMP => DATEADD(days, -4, current_timestamp)::timestamp_tz)
  IGNORE TABLES WITH INSUFFICIENT DATA RETENTION;
Copy