카테고리:

데이터베이스, 스키마 및 공유 DDL

CREATE DATABASE

시스템에 새 데이터베이스를 만듭니다.

또한, 이 명령을 사용하여 다음을 수행할 수 있습니다.

  • 현재 상태 또는 과거의 특정 시간/시점에서(Time Travel 사용) 기존 데이터베이스의 복제본 만들기. 데이터베이스 복제에 대한 자세한 내용은 복제 고려 사항 을 참조하십시오.

  • 다른 Snowflake 계정에서 제공한 공유에서 데이터베이스 만들기. 공유에 대한 자세한 내용은 Secure Data Sharing 소개 를 참조하십시오.

  • 기존 기본 데이터베이스의 복제본(즉, 보조 데이터베이스) 만들기. 데이터베이스 복제에 대한 자세한 내용은 여러 계정에서 데이터베이스 복제 소개 를 참조하십시오.

참고 항목:

ALTER DATABASE , DESCRIBE DATABASE , DROP DATABASE , SHOW DATABASES , UNDROP DATABASE

DESCRIBE SHARE , SHOW SHARES

구문

표준 데이터베이스

CREATE [ OR REPLACE ] [ TRANSIENT ] DATABASE [ IF NOT EXISTS ] <name>
    [ CLONE <source_db>
          [ { AT | BEFORE } ( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> } ) ] ]
    [ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
    [ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
    [ DEFAULT_DDL_COLLATION = '<collation_specification>' ]
    [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
    [ COMMENT = '<string_literal>' ]

(공유의) 공유 데이터베이스

CREATE DATABASE <name> FROM SHARE <provider_account>.<share_name>

보조 데이터베이스(데이터베이스 복제)

CREATE DATABASE <name>
    AS REPLICA OF <account_identifier>.<primary_db_name>
    [ DATA_RETENTION_TIME_IN_DAYS = <integer> ]

필수 매개 변수

name

데이터베이스의 식별자를 지정하며, 계정에 고유한 식별자여야 합니다.

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

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

중요

데이터베이스 복제 및 장애 조치 의 모범 사례로, 각 보조 데이터베이스에 기본 데이터베이스와 똑같은 이름을 지정하는 것이 좋습니다. 이 방법은 뷰에서 정규화된 테이블 이름을 쿼리하는 것과 같이 동일한 데이터베이스의 다른 오브젝트에서 정규화된 오브젝트(즉, '<db>.<스키마>.<오브젝트>')를 참조하는 것을 지원합니다.

보조 데이터베이스의 이름이 기본 데이터베이스와 다른 경우 이러한 오브젝트 참조는 보조 데이터베이스에서 중단됩니다.

Secure Data Sharing 매개 변수

provider_account.share_name

데이터베이스를 만들 원본 공유 의 식별자를 지정합니다. 문서의 설명과 같이, 공유 이름은 공유를 제공하는 계정의 이름으로 정규화해야 합니다.

데이터베이스 복제 매개 변수

AS REPLICA OF account_identifier.primary_db_name

복제본(즉, 보조 데이터베이스)을 만들 원본이 되는 기본 데이터베이스의 식별자를 지정합니다. 식별자에 공백, 특수 문자 또는 대/소문자가 혼합된 문자가 포함된 경우 전체 문자열을 큰따옴표로 묶어야 합니다.

기본 데이터베이스의 계정 식별자와 이름이 필요합니다.

account_identifier

기본 데이터베이스를 저장하는 계정의 고유 식별자입니다. 기본 설정된 식별자는 organization_name.account_name 입니다. 조직에서 복제를 위해 활성화한 계정의 목록을 보려면 SHOW REPLICATION ACCOUNTS를 쿼리하십시오.

레거시 계정 로케이터를 계정 식별자로 사용할 수도 있지만, 앞으로는 작동하지 않을 수 있으므로 사용하지 않는 것이 좋습니다. 계정 로케이터를 계정 식별자로 사용하는 방법에 대한 자세한 내용은 데이터베이스 복제 사용법 노트 를 참조하십시오.

primary_db_name

기본 데이터베이스의 이름입니다. 모범 사례로, 각 보조 데이터베이스에 기본 데이터베이스와 동일한 이름을 지정하는 것이 좋습니다.

참고

데이터베이스 복제 및 장애 조치의 모범 사례로, 보조 데이터베이스에서 선택적 매개 변수 DATA_RETENTION_TIME_IN_DAYS 를 기본 데이터베이스와 똑같은 값으로 설정하는 것이 좋습니다.

선택적 매개 변수

TRANSIENT

데이터베이스를 일시적인 것으로 지정합니다. 일시적 데이터베이스는 Fail-safe 기간이 없으므로 Time Travel을 떠난 후에는 추가적인 저장 비용이 발생하지 않지만, 이는 데이터 손실이 발생할 경우 Fail-safe로 보호되지 않는다는 뜻이기도 합니다. 자세한 내용은 Fail-safe 이해 및 보기 섹션을 참조하십시오.

또한, 정의에 따라 일시적 데이터베이스에서 생성된 모든 스키마와 결과적으로 모든 테이블은 일시적입니다. 일시적 테이블에 대한 자세한 내용은 CREATE TABLE 을 참조하십시오.

기본값: 값 없음(즉, 데이터베이스가 영구적임)

CLONE source_db

지정된 원본 데이터베이스의 복제본을 만들도록 지정합니다. 데이터베이스 복제에 대한 자세한 내용은 CREATE <오브젝트> … CLONE 을 참조하십시오.

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

데이터베이스를 복제할 때 AT | BEFORE 절은 Time Travel을 사용하여 과거의 특정 시점 또는 그 이전의 데이터베이스를 복제하도록 지정합니다. 지정된 Time Travel 시간이 데이터베이스를 만들었던 시점 또는 그 이전인 경우 복제 작업은 오류가 발생하며 실패합니다.

DATA_RETENTION_TIME_IN_DAYS = integer

데이터베이스에서 Time Travel 작업(CLONE 및 UNDROP)을 수행할 수 있는 일수뿐 아니라, 데이터베이스에서 생성된 모든 스키마의 기본 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 섹션을 참조하십시오.

DEFAULT_DDL_COLLATION = 'collation_specification'

데이터베이스에 추가된 모든 스키마와 테이블에 대한 기본 데이터 정렬 사양 을 지정합니다. 스키마 및 개별 테이블 수준에서 기본값을 재정의할 수 있습니다.

이 매개 변수에 대한 자세한 내용은 DEFAULT_DDL_COLLATION 을 참조하십시오.

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

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

태그 값은 항상 문자열이며, 태그 값의 최대 문자 수는 256자입니다. 오브젝트에 설정할 수 있는 고유한 태그의 최대 수는 20개입니다. 자세한 내용은 오브젝트/열에 대한 태그 할당량 섹션을 참조하십시오.

단일 CREATE 문으로 오브젝트에서 최대 5개의 태그를 설정할 수 있습니다.

COMMENT = 'string_literal'

데이터베이스에 대한 설명을 지정합니다.

기본값: 값 없음

액세스 제어 요구 사항

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

권한

오브젝트

참고

CREATE DATABASE

계정

Only the SYSADMIN role, or a higher role, has this privilege by default. The privilege can be granted to additional roles as needed.

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

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

일반적인 사용법 노트

  • 데이터베이스를 만들면 현재 세션의 활성/현재 데이터베이스로 자동으로 설정됩니다(데이터베이스에 USE DATABASE 명령을 사용하는 것과 같음).

  • 같은 이름의 데이터베이스가 이미 있는 경우 명령에 선택적인 OR REPLACE 키워드를 지정하지 않는 한 오류가 반환되고 데이터베이스가 생성되지 않습니다.

    중요

    OR REPLACE 를 사용하는 것은 기존 데이터베이스에서 DROP DATABASE 를 사용한 다음 같은 이름을 가진 새 데이터베이스를 만드는 것과 같습니다. 하지만 삭제된 데이터베이스가 시스템에서 영구적으로 제거되는 것은 아닙니다. 대신, 삭제된 데이터베이스는 Time Travel에 보존됩니다. Time Travel에 있는 삭제된 데이터베이스가 계정의 데이터 저장에 기여하므로 이는 중요한 점입니다. 자세한 내용은 Time Travel 및 Fail-safe 관련 저장소 요금 섹션을 참조하십시오.

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

  • 새 데이터베이스를 만들면 데이터베이스에 다음 두 스키마가 자동으로 생성됩니다.

    • PUBLIC: 데이터베이스의 기본 스키마입니다.

    • INFORMATION_SCHEMA: 데이터베이스의 오브젝트뿐 아니라 계정의 모든 오브젝트에 대한 메타데이터를 쿼리하는 데 사용할 수 있는 뷰 및 테이블 함수가 포함된 스키마입니다.

  • 공유에서 생성된 데이터베이스는 다음과 같은 점에서 표준 데이터베이스와 다릅니다.

    • 이러한 스키마가 공유에 명시적으로 허가되지 않는 한 이런 데이터베이스에는 PUBLIC 또는 INFORMATION_SCHEMA 스키마가 없습니다.

    • 이런 데이터베이스는 복제할 수 없습니다.

    • TRANSIENTDATA_RETENTION_TIME_IN_DAYS 와 같은 속성은 적용되지 않습니다.

  • 데이터베이스가 활성/최신 상태이면 다른 스키마를 사용하거나 PUBLIC 스키마를 삭제하지 않은 한 기본적으로 PUBLIC 스키마도 활성/최신 상태입니다.

  • 메타데이터 관련:

    주의

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

데이터베이스 복제 사용법 노트

  • 데이터베이스 복제는 자체 가상 웨어하우스 대신 Snowflake에서 제공하는 컴퓨팅 리소스를 사용하여 오브젝트와 데이터를 복사합니다. 그러나 STATEMENT_TIMEOUT_IN_SECONDS 세션/오브젝트 매개 변수는 취소되기 전에 문이 실행되는 시간을 계속 제어합니다. 기본값은 172800 (2일)입니다. 기본 데이터베이스의 초기 복제 는 완료하는 데 2일 이상 걸릴 수 있으므로(데이터베이스에 있는 메타데이터의 양뿐 아니라 데이터베이스 오브젝트에 있는 데이터의 양에 따라서도 다름), 복제 작업을 실행하는 세션의 경우 STATEMENT_TIMEOUT_IN_SECONDS 값을 604800 (7일, 최대값)으로 늘리는 것이 좋습니다.

    동일한 세션에서 ALTER DATABASE secondary_db_name REFRESH 문을 실행하기 전 다음 ALTER SESSION 문을 실행합니다.

    ALTER SESSION SET STATEMENT_TIMEOUT_IN_SECONDS = 604800;
    

    STATEMENT_TIMEOUT_IN_SECONDS 매개 변수는 세션의 활성 웨어하우스에도 적용됩니다. 매개 변수는 세션 또는 웨어하우스 수준에서 설정된 낮은 값을 따릅니다. 현재 세션에 활성 웨어하우스가 있는 경우 이 웨어하우스에 대해서도 STATEMENT_TIMEOUT_IN_SECONDS 를 604800 으로 설정합니다(ALTER WAREHOUSE 사용).

    예:

    -- determine the active warehouse in the current session (if any)
    SELECT CURRENT_WAREHOUSE();
    
    +---------------------+
    | CURRENT_WAREHOUSE() |
    |---------------------|
    | MY_WH               |
    +---------------------+
    
    -- change the STATEMENT_TIMEOUT_IN_SECONDS value for the active warehouse
    
    ALTER WAREHOUSE my_wh SET STATEMENT_TIMEOUT_IN_SECONDS = 604800;
    

    복제 작업이 완료된 후 매개 변수 값을 기본값으로 재설정할 수 있습니다.

    ALTER WAREHOUSE my_wh UNSET STATEMENT_TIMEOUT_IN_SECONDS;
    
  • 기본 데이터베이스를 저장하는 계정을 식별하도록 기본 설정된 방법에서는 조직 이름과 계정 이름을 계정 식별자로 사용합니다. 레거시 계정 로케이터를 대신 사용하기로 결정한 경우 계정을 고유하게 식별하려면 추가 세그먼트를 포함해야 할 수 있습니다. 참고로 아래 표를 참조하십시오.

    계정 식별자

    원격 계정의 위치

    organization_name.account_name

    기본 데이터베이스를 저장하는 계정의 리전 또는 리전 그룹에 관계없이 사용할 수 있는 기본 설정 계정 식별자입니다.

    account_locator

    리전은 같지만 기본 데이터베이스를 저장하는 계정과는 다른 계정입니다.

    snowflake_region.account_locator

    리전 그룹은 같지만 기본 데이터베이스를 저장하는 계정과는 다른 리전입니다.

    region_group.snowflake_region.account_locator

    기본 데이터베이스를 저장하는 계정과 다른 리전 그룹 입니다.

데이터 보존 기간이 10일인 영구 데이터베이스 두 개 만들기:

CREATE DATABASE mytestdb;

CREATE DATABASE mytestdb2 DATA_RETENTION_TIME_IN_DAYS = 10;

SHOW DATABASES LIKE 'my%';

+---------------------------------+------------+------------+------------+--------+----------+---------+---------+----------------+
| created_on                      | name       | is_default | is_current | origin | owner    | comment | options | retention_time |
|---------------------------------+------------+------------+------------+--------+----------+---------+---------+----------------|
| Tue, 17 Mar 2016 16:57:04 -0700 | MYTESTDB   | N          | N          |        | PUBLIC   |         |         | 1              |
| Tue, 17 Mar 2016 17:06:32 -0700 | MYTESTDB2  | N          | N          |        | PUBLIC   |         |         | 10             |
+---------------------------------+------------+------------+------------+--------+----------+---------+---------+----------------+

일시적 데이터베이스 만들기:

CREATE TRANSIENT DATABASE mytransientdb;

SHOW DATABASES LIKE 'my%';

+---------------------------------+---------------+------------+------------+--------+----------+---------+-----------+----------------+
| created_on                      | name          | is_default | is_current | origin | owner    | comment | options   | retention_time |
|---------------------------------+---------------+------------+------------+--------+----------+---------+-----------+----------------|
| Tue, 17 Mar 2016 16:57:04 -0700 | MYTESTDB      | N          | N          |        | PUBLIC   |         |           | 1              |
| Tue, 17 Mar 2016 17:06:32 -0700 | MYTESTDB2     | N          | N          |        | PUBLIC   |         |           | 10             |
| Tue, 17 Mar 2015 17:07:51 -0700 | MYTRANSIENTDB | N          | N          |        | PUBLIC   |         | TRANSIENT | 1              |
+---------------------------------+---------------+------------+------------+--------+----------+---------+-----------+----------------+

계정 ab67890 에서 제공한 공유에서 데이터베이스 만들기:

CREATE DATABASE snow_sales FROM SHARE ab67890.sales_s;

공유에서 데이터베이스를 만드는 더 자세한 예는 데이터 컨슈머 를 참조하십시오.

데이터베이스 복제 예

다음 예에서는 myorg 조직의 account1 계정에 myorg.account1.mydb1 기본 데이터베이스의 복제본을 만들고 복제본의 구체화된 뷰 자동 새로 고침을 사용합니다. SQL 문이 같은 AWS 리전 그룹(public)에서 실행되지만, 기본 데이터베이스를 저장하는 계정과는 다른 리전입니다.

CREATE DATABASE mydb1
  AS REPLICA OF myorg.account1.mydb1
  DATA_RETENTION_TIME_IN_DAYS = 10;
맨 위로 이동