CREATE DATABASE¶
システムに新しいデータベースを作成します。
さらに、このコマンドは次の目的にも使用できます。
既存のデータベースのクローン を、現在の状態で、または過去の特定の時間/ポイントで作成します(Time Travelを使用)。データベースのクローン作成の詳細については、 クローニングに関する考慮事項 をご参照ください。
別のSnowflakeアカウントが提供する共有からデータベースを作成します。共有の詳細については、 Secure Data Sharingの紹介 をご参照ください。
既存のプライマリデータベース(つまり、セカンダリデータベース)のレプリカを作成します。データベース複製の詳細については、 複数のアカウントにわたるデータベース複製の概要 をご参照ください。
- こちらもご参照ください。
ALTER DATABASE、 DESCRIBE DATABASE、 DROP DATABASE、 SHOW DATABASES、 UNDROP DATABASE
構文¶
標準データベース
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> ]
[ EXTERNAL_VOLUME = <external_volume_name> ]
[ CATALOG = <catalog_integration_name> ]
[ DEFAULT_DDL_COLLATION = '<collation_specification>' ]
[ COMMENT = '<string_literal>' ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
共有データベース(共有から)
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"
)。二重引用符で囲まれた識別子も大文字と小文字が区別されます。詳細については、 識別子の要件 をご参照ください。
重要
データベースの複製とフェールオーバー のベストプラクティスとして、各セカンダリデータベースにプライマリデータベースと同じ名前を付けることをお勧めします。この方法では、ビュー内の完全修飾テーブル名のクエリなど、同じデータベース内の他のオブジェクトによる完全修飾オブジェクト(つまり、
'<データベース>.<スキーマ>.<オブジェクト>'
)の参照をサポートします。セカンダリデータベースの名前がプライマリデータベースと異なる場合、これらのオブジェクト参照はセカンダリデータベースで壊れます。
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 をご参照ください。
EXTERNAL_VOLUME = external_volume_name
Icebergテーブル に使用するデフォルト外部ボリュームを指定するオブジェクトパラメーター。
このパラメーターの詳細については、 EXTERNAL_VOLUME をご参照ください。
CATALOG = catalog_integration_name
Icebergテーブル に使用するデフォルトのカタログ統合を指定するオブジェクトパラメーター。
このパラメーターの詳細については、 CATALOG をご参照ください。
DEFAULT_DDL_COLLATION = 'collation_specification'
データベースに追加されたすべてのスキーマとテーブルのデフォルトの 照合順序仕様 を指定します。デフォルトは、スキーマおよび個々のテーブルレベルで上書きできます。
パラメーターの詳細については、 DEFAULT_DDL_COLLATION をご参照ください。
COMMENT = 'string_literal'
データベースのコメントを指定します。
デフォルト: 値なし
TAG ( tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] )
タグ の名前とタグ文字列の値を指定します。
タグ値は常に文字列であり、タグ値の最大文字数は256です。
ステートメントでのタグの指定に関する情報については、 オブジェクトおよび列のタグクォータ をご参照ください。
アクセス制御の要件¶
この 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. |
USAGE |
外部ボリューム、カタログ統合 |
|
指定された権限のセットを使用してカスタムロールを作成する手順については、 カスタムロールの作成 をご参照ください。
セキュリティ保護可能なオブジェクト に対して SQL アクションを実行するためのロールと権限付与に関する一般的な情報については、 アクセス制御の概要 をご参照ください。
一般的な使用上の注意¶
データベースを作成すると、現在のセッション用にアクティブ/現在のデータベースとして自動的に設定されます(データベースに対して USE DATABASE コマンドを使用するのと同等)。
同じ名前のデータベースが既に存在する場合、エラーが返され、コマンドでオプションの
OR REPLACE
キーワードが指定されていない限り、データベースは作成されません。重要
OR REPLACE
の使用は、既存のデータベースで DROP DATABASE を使用してから、同じ名前で新しいデータベースを作成することと同等です。ただし、ドロップされたデータベースは、システムから完全には削除 されません 。代わりに、Time Travel内で保持されます。Time Travelでドロップされたデータベースはアカウントのデータストレージに寄与するため、これは重要です。詳細については、 Time TravelおよびFail-safeのストレージコスト をご参照ください。CREATE OR REPLACE <オブジェクト> ステートメントはアトミックです。つまり、オブジェクトが置き換えられると、単一のトランザクションで、古いオブジェクトが削除されて新しいオブジェクトが作成されます。
新しいデータベースを作成すると、データベースに2つのスキーマが自動的に作成されます。
PUBLIC: データベースのデフォルトのスキーマ。
INFORMATION_SCHEMA: データベース内のオブジェクトに関するメタデータのクエリに使用できるビューとテーブル関数を含むスキーマ。アカウント内のすべてのオブジェクトにわたって使用できます。
共有から作成されたデータベースは、次の点で標準データベースと異なります。
これらのスキーマが共有に明示的に付与されていない限り、PUBLIC または INFORMATION_SCHEMA スキーマはありません。
それらは複製できません。
TRANSIENT
やDATA_RETENTION_TIME_IN_DAYS
などのプロパティは適用されません。
データベースがアクティブ/現在の場合は、別のスキーマを使用するか、PUBLIC スキーマをドロップする場合を除き、PUBLIC スキーマもデフォルトでアクティブ/現在になります。
メタデータについて。
注意
Snowflakeサービスを使用する場合、お客様は、個人データ(ユーザーオブジェクト向け以外)、機密データ、輸出管理データ、またはその他の規制されたデータがメタデータとして入力されていないことを確認する必要があります。詳細については、 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
プライマリデータベースを保存するアカウントと リージョングループ が異なります。
CREATE DATABASE ... AS REPLICA コマンドは、 WITH TAG 句をサポートしていません。
セカンダリデータベースは読み取り専用であるため、この句はサポートされません。プライマリデータベースが WITH TAG 句を指定している場合は、セカンダリデータベースを作成する前に句を削除します。データベースに WITH TAG 句があるかどうかを確認するには、Snowflakeアカウントで GET_DDL 関数を呼び出し、関数の引数にプライマリデータベースを指定します。データベースにタグが設定されている場合、関数の出力には ALTER DATABASE ... SET TAG ステートメントが含まれます。
詳細については、 複製とタグ をご参照ください。
例¶
データ保持期間が10日である2つの永続的なデータベースを作成します。
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;