CREATE DATABASE

CREATE DATABASE

시스템에 새 데이터베이스(database)를 만드는 명령이에요. 데이터베이스는 테이블, 뷰 등 객체를 담는 최상위 컨테이너예요.

출처: 문서

본문

이 명령은 다음 변형(variant)을 지원해요:

  • CREATE OR ALTER DATABASE: 데이터베이스가 없으면 만들고, 있으면 수정합니다.
  • CREATE DATABASE … CLONE: 기존 데이터베이스의 현재 상태 또는 특정 시점(Time Travel 사용)의 복제본을 만듭니다.
  • CREATE DATABASE … FROM BACKUP SET: 백업에서 새 이름으로 데이터베이스를 복원합니다.

또한 이 명령은 다음 작업에도 사용할 수 있어요:

  • 지정된 리스팅(listing)에서 데이터베이스를 생성.
  • 다른 Snowflake 계정이 제공하는 공유(share)에서 데이터베이스를 생성 (Secure Data Sharing).
  • 기존 기본 데이터베이스의 복제본(보조 데이터베이스)을 생성.

구문 (Syntax)

표준 데이터베이스:

CREATE [ OR REPLACE ] [ TRANSIENT ] DATABASE [ IF NOT EXISTS ] <name>
    [ CLONE <source_schema>
        [ { AT | BEFORE } ( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> } ) ]
        [ IGNORE TABLES WITH INSUFFICIENT DATA RETENTION ]
        [ IGNORE HYBRID TABLES ] ]
    [ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
    [ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
    [ EXTERNAL_VOLUME = <external_volume_name> ]
    [ CATALOG = <catalog_integration_name> ]
    [ ICEBERG_DEFAULT_DDL_COLLATION = '<collation_specification>' ]
    [ ICEBERG_VERSION_DEFAULT = <integer> ]
    [ ICEBERG_MERGE_ON_READ_BEHAVIOR = { 'AUTO' | 'ENABLED' | 'DISABLED' } ]
    [ ENABLE_ICEBERG_MERGE_ON_READ = { TRUE | FALSE } ]
    [ REPLACE_INVALID_CHARACTERS = { TRUE | FALSE } ]
    [ DEFAULT_DDL_COLLATION = '<collation_specification>' ]
    [ STORAGE_SERIALIZATION_POLICY = { COMPATIBLE | OPTIMIZED } ]
    [ COMMENT = '<string_literal>' ]
    [ CATALOG_SYNC = '<snowflake_open_catalog_integration_name>' ]
    [ CATALOG_SYNC_NAMESPACE_MODE = { NEST | FLATTEN } ]
    [ CATALOG_SYNC_NAMESPACE_FLATTEN_DELIMITER = '<string_literal>' ]
    [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
    [ WITH CONTACT ( <purpose> = <contact_name> [ , <purpose> = <contact_name> ... ] ) ]
    [ OBJECT_VISIBILITY = { <object_visibility_spec> | PRIVILEGED } ]
    [ ENABLE_DATA_COMPACTION = { TRUE | FALSE } ]
    [ OAUTH_AUTHORIZATION_SERVER = <integration_name> ]
    [ OAUTH_SCOPES_SUPPORTED = '<comma_separated_scopes>' ]

백업에서 복원된 데이터베이스:

CREATE DATABASE <name> FROM BACKUP SET <backup_set> IDENTIFIER '<backup_id>'

리스팅에서 생성한 표준 데이터베이스:

CREATE DATABASE <name> FROM LISTING '<listing_global_name>'

공유에서 생성한 공유 데이터베이스:

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> ]

CREATE OR ALTER DATABASE 구문

CREATE OR ALTER [ TRANSIENT ] DATABASE <name>
    [ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
    [ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
    [ EXTERNAL_VOLUME = <external_volume_name> ]
    [ CATALOG = <catalog_integration_name> ]
    [ ICEBERG_DEFAULT_DDL_COLLATION = '<collation_specification>' ]
    [ ICEBERG_VERSION_DEFAULT = <integer> ]
    [ ICEBERG_MERGE_ON_READ_BEHAVIOR = { 'AUTO' | 'ENABLED' | 'DISABLED' } ]
    [ ENABLE_ICEBERG_MERGE_ON_READ = { TRUE | FALSE } ]
    [ REPLACE_INVALID_CHARACTERS = { TRUE | FALSE } ]
    [ DEFAULT_DDL_COLLATION = '<collation_specification>' ]
    [ LOG_LEVEL = '<log_level>' ]
    [ METRIC_LEVEL = '<metric_level>' ]
    [ TRACE_LEVEL = '<trace_level>' ]
    [ STORAGE_SERIALIZATION_POLICY = { COMPATIBLE | OPTIMIZED } ]
    [ COMMENT = '<string_literal>' ]
    [ OBJECT_VISIBILITY = { <object_visibility_spec> | PRIVILEGED } ]

CREATE DATABASE … CLONE 구문

CREATE [ OR REPLACE ] DATABASE [ IF NOT EXISTS ] <name> CLONE <source_database>
  [ ... ]

필수 매개변수

  • <name>: 데이터베이스의 식별자예요. 계정 내에서 고유해야 해요. 기본 문자로 시작해야 하며, 큰따옴표로 감싸지 않는 한 공백이나 특수 문자를 포함할 수 없어요 (예: "My object").

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: 기본 데이터베이스의 이름이에요.

백업 매개변수

  • FROM BACKUP SET 절은 백업에서 데이터베이스를 복원해요. 복원된 데이터베이스는 백업 원본 데이터베이스와 독립적이에요. 두 데이터베이스 간에 복제 관계는 없어요.
    • backup_set: 특정 데이터베이스에 대해 만든 백업 세트의 이름을 지정해요. SHOW BACKUP SETS 명령으로 찾을 수 있어요.
    • backup_id: 해당 백업 세트 내 특정 백업의 식별자를 지정해요. SHOW BACKUPS IN BACKUP SET 명령으로 찾을 수 있어요.
  • FROM SNAPSHOT SET 절은 더 이상 사용되지 않아요(사용 중단). FROM BACKUP SET을 사용하세요.

리스팅 매개변수

  • 'listing_global_name': 데이터베이스를 만들 리스팅의 글로벌 이름을 지정해요. 유료 리스팅일 수 없고, 리스팅 이용 약관(타입이 OFFLINE이 아닌 경우)을 Snowsight에서 수락해야 하며, 리스팅 데이터 제품이 현재 리전에 로컬로 제공되어야 해요. 리스팅에서 데이터베이스를 만들려면 IMPORT LISTING 권한이 필요해요. 공유에서 만들려면 IMPORT SHARE 권한이 필요해요.

선택 매개변수

  • TRANSIENT: 데이터베이스를 임시(transient)로 지정해요. 임시 데이터베이스는 Fail-safe 기간이 없어 Time Travel을 벗어난 뒤 추가 저장 비용이 들지 않아요. 기본값: 값 없음 (영구 데이터베이스).
  • CLONE source_db: 지정한 소스 데이터베이스의 복제본을 만들어요.
  • AT | BEFORE ( TIMESTAMP | OFFSET | STATEMENT ): 데이터베이스를 복제할 때 Time Travel로 과거 특정 시점에 복제하도록 지정해요.
  • IGNORE TABLES WITH INSUFFICIENT DATA RETENTION: Time Travel에 과거 데이터가 더 이상 없는 테이블은 복제를 건너뛰어요.
  • IGNORE HYBRID TABLES: 하이브리드 테이블은 복제하지 않고 건너뛰어요.
  • DATA_RETENTION_TIME_IN_DAYS = integer: 데이터베이스에 대해 Time Travel 작업(CLONE, UNDROP)을 수행할 수 있는 일 수를 지정해요. Standard Edition: 0 또는 1. Enterprise Edition: 영구 데이터베이스에 0~90, 임시 데이터베이스에 0 또는 1. 값 0은 Time Travel을 비활성화해요.
  • MAX_DATA_EXTENSION_TIME_IN_DAYS = integer: 스트림이 오래되지 않도록 Snowflake가 테이블의 데이터 보존 기간을 연장할 수 있는 최대 일 수를 지정해요.
  • EXTERNAL_VOLUME = external_volume_name: Apache Iceberg™ 테이블에 사용할 기본 외부 볼륨을 지정해요.
  • CATALOG = catalog_integration_name: Apache Iceberg™ 테이블에 사용할 기본 카탈로그 인티그레이션을 지정해요.
  • ICEBERG_DEFAULT_DDL_COLLATION = 'collation_specification': Snowflake 관리 Iceberg 테이블의 새 문자열 컬럼에 대한 기본 정렬(collation) 지정을 지정해요.
  • ICEBERG_VERSION_DEFAULT = integer: Iceberg 테이블이 따르는 Apache Iceberg™ 테이블 사양 버전을 지정해요. 값: 2 또는 3. 기본값: 2.
  • DEFAULT_METADATA_WRITE_FORMAT = { SNOWFLAKE | ICEBERG }: 이 범위에서 CREATE TABLE/ALTER TABLE로 만든 새 테이블의 기본 메타데이터 쓰기 형식을 지정해요. 기본값: SNOWFLAKE.
  • ICEBERG_MERGE_ON_READ_BEHAVIOR = { 'AUTO' | 'ENABLED' | 'DISABLED' }: Apache Iceberg™ 테이블에서 행 수준 업데이트(UPDATE, DELETE, MERGE)를 수행하는 방식을 지정해요. merge-on-read와 copy-on-write 중 선택해요. 기본값: 'AUTO'.
  • ENABLE_ICEBERG_MERGE_ON_READ = { TRUE | FALSE }: 더 이상 사용되지 않는(사용 중단) 매개변수예요. ICEBERG_MERGE_ON_READ_BEHAVIOR를 사용하세요. 기본값: TRUE.
  • REPLACE_INVALID_CHARACTERS = { TRUE | FALSE }: Iceberg 테이블의 쿼리 결과에서 잘못된 UTF-8 문자를 유니코드 대체 문자(�)로 바꿀지 지정해요. 외부 Iceberg 카탈로그를 사용하는 테이블에만 설정할 수 있어요. 기본값: FALSE.
  • DEFAULT_DDL_COLLATION = 'collation_specification': 데이터베이스에 추가되는 모든 스키마와 테이블의 기본 정렬 지정을 지정해요.
  • LOG_LEVEL = 'log_level': 활성 이벤트 테이블에 수집할 메시지의 심각도 수준을 지정해요.
  • METRIC_LEVEL = 'metric_level': 메트릭 데이터를 활성 이벤트 테이블에 수집할지 지정해요.
  • TRACE_LEVEL = 'trace_level': trace 이벤트를 이벤트 테이블에 수집하는 방식을 제어해요.
  • STORAGE_SERIALIZATION_POLICY = { COMPATIBLE | OPTIMIZED }: Snowflake를 카탈로그로 사용하는 Apache Iceberg™ 테이블의 저장소 직렬화 정책을 지정해요. 기본값: OPTIMIZED.
  • COMMENT = 'string_literal': 데이터베이스에 대한 주석을 지정해요.
  • CATALOG_SYNC = 'snowflake_open_catalog_integration_name': Snowflake Open Catalog용으로 구성된 카탈로그 인티그레이션 이름을 지정해요. 지정하면 Snowflake가 데이터베이스의 Snowflake 관리 Iceberg 테이블을 외부 카탈로그와 동기화해요.
  • CATALOG_SYNC_NAMESPACE_MODE = { NEST | FLATTEN }: Open Catalog와 동기화하는 Snowflake 관리 Iceberg 테이블의 카탈로그 동기화 네임스페이스 모드를 지정해요. 기본값: NEST.
  • CATALOG_SYNC_NAMESPACE_FLATTEN_DELIMITER = 'string_literal': CATALOG_SYNC_NAMESPACE_MODEFLATTEN으로 설정할 때 Snowflake가 평탄화된 네임스페이스에 삽입하는 구분자를 지정해요. 유효 문자: 0-9, A-Z, a-z, _, $, -.
  • TAG ( tag_name = 'tag_value' [ , ... ] ): 태그 이름과 태그 문자열 값을 지정해요. 태그 값은 항상 문자열이고 최대 256자예요.
  • WITH CONTACT ( purpose = contact [ , ...] ): 새 객체를 하나 이상의 연락처(contact)와 연결해요.
  • OBJECT_VISIBILITY = { object_visibility_spec | PRIVILEGED }: 객체의 가시성을 설명하는 YAML 사양을 지정해요. PRIVILEGED가 Snowflake 기본 동작이에요.
$$
organization_targets:
  - all_accounts_including_external
$$

또는:

$$
organization_targets:
  - account: <account_name_1>
  - account: <account_name_2>
  - ...
  - organization_user_group: <org_user_group_1>
  - organization_user_group: <org_user_group_2>
$$
  • all_accounts_including_external: 조직의 모든 계정에 있는 모든 사용자가 객체를 볼 수 있어요 (외부 당사자에게 접근이 부여된 리더 계정 등 포함).
  • account: account_name: 지정된 계정의 모든 사용자가 객체를 볼 수 있어요. account는 계정 이름이지 계정 로케이터가 아니에요.
  • organization_user_group: org_user_group: 지정된 조직 사용자 그룹이 객체를 볼 수 있어요.
  • PRIVILEGED: 현재 계정에서 객체에 명시적 권한이 부여된 역할만 객체를 볼 수 있어요.
  • ENABLE_DATA_COMPACTION = { TRUE | FALSE }: Snowflake 관리 Apache Iceberg™ 테이블에서 데이터 컴팩션을 활성화할지 지정해요. 기본값: TRUE.
  • OAUTH_AUTHORIZATION_SERVER = integration_name: 이 데이터베이스의 MCP 서버에 대한 인가 서버로 External OAuth 보안 인티그레이션을 지정해요.
  • OAUTH_SCOPES_SUPPORTED = 'comma_separated_scopes': 이 데이터베이스의 MCP 서버에 광고할 OAuth 스코프를 지정해요.

접근 제어 요구 사항

이 작업을 실행하려면 역할에 최소한 다음 권한이 필요해요:

권한 객체 참고
CREATE DATABASE 계정 새 데이터베이스 생성에 필요. 기본적으로 SYSADMIN 또는 그 이상 역할만 이 권한을 가져요.
USAGE 외부 볼륨, 카탈로그 인티그레이션 EXTERNAL_VOLUME 또는 CATALOG 객체 매개변수 설정 시 각각 필요.
IMPORT LISTING 계정 리스팅에서 데이터베이스 생성에 필요.
IMPORT SHARE 계정 공유에서 데이터베이스 생성에 필요.
MANAGE VISIBILITY 계정 OBJECT_VISIBILITY 속성 설정에 필요. 기본적으로 SECURITYADMIN 역할만 가져요.
MODIFY LOG LEVEL 계정 데이터베이스의 LOG_LEVEL 설정에 필요.
MODIFY TRACE LEVEL 계정 데이터베이스의 TRACE_LEVEL 설정에 필요.
OWNERSHIP 데이터베이스 기존 데이터베이스에 대한 CREATE OR ALTER DATABASE 문 실행에 필요.

일반 사용법 참고 사항

  • 데이터베이스를 만들면 자동으로 현재 세션의 활성/현재 데이터베이스로 설정돼요 (USE DATABASE 명령과 동일).
  • 같은 이름의 데이터베이스가 이미 있으면 오류가 반환되고 생성되지 않아요. OR REPLACE 키워드를 지정하면 기존 데이터베이스에 DROP DATABASE를 수행한 다음 같은 이름으로 새 데이터베이스를 만드는 것과 동일해요. 이때 드롭된 데이터베이스는 Time Travel에 보존돼요.
  • OR REPLACEIF NOT EXISTS 절은 상호 배타적이에요.
  • CREATE OR REPLACE <object> 문은 원자적이에요.
  • 새 데이터베이스를 만들면 두 개의 스키마가 자동으로 생성돼요:
    • PUBLIC: 데이터베이스의 기본 스키마.
    • INFORMATION_SCHEMA: 데이터베이스 객체에 대한 메타데이터를 쿼리하는 뷰와 테이블 함수를 포함하는 스키마.
  • 공유에서 만든 데이터베이스는 표준 데이터베이스와 다음에서 달라요:
    • PUBLIC 스키마를 포함하지 않아요 (공유에 명시적으로 부여된 경우 제외). INFORMATION_SCHEMA 스키마는 자동으로 포함해요.
    • 복제할 수 없어요.
    • TRANSIENTDATA_RETENTION_TIME_IN_DAYS 같은 속성이 적용되지 않아요.

CREATE OR ALTER DATABASE 사용법 참고 사항

ALTER DATABASE 명령의 모든 제한이 적용돼요. 다음은 지원되지 않아요:

  • SWAP WITH 매개변수를 사용한 데이터베이스 교체.
  • RENAME TO 매개변수를 사용한 데이터베이스 이름 변경.
  • CLONE 매개변수를 사용한 데이터베이스 복제.
  • 태그와 폴리시 추가/변경. 기존 태그와 폴리시는 보존돼요.
  • TRANSIENT 데이터베이스를 비-임시 데이터베이스로 변환하거나 그 반대.
  • CREATE OR ALTER DATABASE … FROM SHARE로 공유에서 데이터베이스 생성.
  • CREATE OR ALTER DATABASE … AS REPLICA OF로 보조(복제본) 데이터베이스 생성.

데이터베이스 복제 사용법 참고 사항

  • 데이터베이스 복제는 객체와 데이터를 복사할 때 가상 웨어하우스 대신 Snowflake 제공 컴퓨팅 리소스를 사용해요. 그러나 STATEMENT_TIMEOUT_IN_SECONDS 세션/객체 매개변수는 여전히 문이 취소되기 전 실행 시간을 제어해요. 기본값은 172800(2일)이에요. 초기 복제가 2일 이상 걸릴 수 있으므로 복제 작업을 실행하는 세션에서 값을 604800(7일, 최대값)으로 늘리는 것을 권장해요.
ALTER SESSION SET STATEMENT_TIMEOUT_IN_SECONDS = 604800;

활성 웨어하우스가 있으면 이 웨어하우스에도 604800으로 설정하세요:

-- determine the active warehouse in the current session (if any)
SELECT CURRENT_WAREHOUSE();

-- 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;
  • CREATE DATABASE … AS REPLICA 명령은 WITH TAG 절을 지원하지 않아요. 보조 데이터베이스는 읽기 전용이기 때문이에요.

예제 (Examples)

영구 데이터베이스 두 개를 만들되, 하나는 10일의 데이터 보존 기간으로 만들어요:

CREATE DATABASE mytestdb;

CREATE DATABASE mytestdb2 DATA_RETENTION_TIME_IN_DAYS = 10;

SHOW DATABASES LIKE 'my%';

임시 데이터베이스를 만들어요:

CREATE TRANSIENT DATABASE mytransientdb;

SHOW DATABASES LIKE 'my%';

계정 ab67890이 제공하는 공유에서 데이터베이스를 만들어요:

CREATE DATABASE snow_sales FROM SHARE ab67890.sales_s;

CREATE OR ALTER DATABASE 예제

db1이라는 데이터베이스를 만들어요:

CREATE OR ALTER DATABASE db1;

데이터베이스 db1을 수정해 DATA_RETENTION_TIME_IN_DAYS와 DEFAULT_DDL_COLLATION 매개변수를 설정해요:

CREATE OR ALTER DATABASE db1
  DATA_RETENTION_TIME_IN_DAYS = 5
  DEFAULT_DDL_COLLATION = 'de';

이전에 설정한 매개변수 해제하기: 수정된 데이터베이스 정의에 이전에 설정한 매개변수가 없으면 해제돼요.

CREATE OR ALTER DATABASE db1
  DEFAULT_DDL_COLLATION = 'de';

더 알아보기 (Learn more)