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_MODE를FLATTEN으로 설정할 때 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 REPLACE와IF NOT EXISTS절은 상호 배타적이에요.CREATE OR REPLACE <object>문은 원자적이에요.- 새 데이터베이스를 만들면 두 개의 스키마가 자동으로 생성돼요:
- PUBLIC: 데이터베이스의 기본 스키마.
- INFORMATION_SCHEMA: 데이터베이스 객체에 대한 메타데이터를 쿼리하는 뷰와 테이블 함수를 포함하는 스키마.
- 공유에서 만든 데이터베이스는 표준 데이터베이스와 다음에서 달라요:
PUBLIC스키마를 포함하지 않아요 (공유에 명시적으로 부여된 경우 제외).INFORMATION_SCHEMA스키마는 자동으로 포함해요.- 복제할 수 없어요.
TRANSIENT및DATA_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)
- ALTER DATABASE
- DESCRIBE DATABASE
- DROP DATABASE
- SHOW DATABASES
- UNDROP DATABASE
- CREATE LISTING
- CREATE
- 리스팅 공유, Secure Data Sharing, 데이터베이스 복제 소개