カテゴリ:

データベース、スキーマ、共有 DDL

CREATE DATABASE

システムに新しいデータベースを作成します。

さらに、このコマンドは次の目的にも使用できます。

こちらもご参照ください。

ALTER DATABASEDESCRIBE DATABASEDROP DATABASESHOW DATABASESUNDROP DATABASE

DESCRIBE SHARESHOW 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")。二重引用符で囲まれた識別子も大文字と小文字が区別されます。

詳細については、 識別子の要件 をご参照ください。

重要

データベースの複製とフェールオーバー のベストプラクティスとして、各セカンダリデータベースにプライマリデータベースと同じ名前を付けることをお勧めします。この方法では、ビュー内の完全修飾テーブル名のクエリなど、同じデータベース内の他のオブジェクトによる完全修飾オブジェクト(つまり、 '<データベース>.<スキーマ>.<オブジェクト>')の参照をサポートします。

セカンダリデータベースの名前がプライマリデータベースと異なる場合、これらのオブジェクト参照はセカンダリデータベースで壊れます。

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:

    • 永続データベースの場合は 090

    • 一次データベースの場合は 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です。

ステートメントにあるタグの指定の詳細については、 オブジェクトおよび列のタグクォータ をご参照ください。

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 <オブジェクト> ステートメントはアトミックです。つまり、オブジェクトが置き換えられると、古いオブジェクトの削除と新しいオブジェクトの作成が1つのトランザクションで処理されます。

  • 新しいデータベースを作成すると、データベースに2つのスキーマが自動的に作成されます。

    • 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日である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;
最上部に戻る