カテゴリ:

データベース、スキーマ、共有 DDLテーブル、ビュー、シーケンス DDLDDLデータのロード/アンロード

CREATE <オブジェクト> ... CLONE

システム内の既存のオブジェクトのコピーを作成します。このコマンドは主に、データベース、スキーマ、およびテーブルの ゼロコピークローン を作成するために使用されます。ただし、他のスキーマオブジェクト(外部ステージ、ファイル形式、シーケンス)のクローンをすばやく/簡単に作成するためにも使用できます。

このコマンドは、 CLONE キーワードが追加されたオブジェクト固有の CREATE <オブジェクト> コマンドのバリエーションです。

注釈

データベース、スキーマ、および非仮テーブルの場合、 CLONETime Travel を使用したクローン作成のための追加の AT | BEFORE 句をサポートします。

このトピックの内容:

構文

データベース、スキーマ、テーブル、ストリーム

CREATE [ OR REPLACE ] { DATABASE | SCHEMA | TABLE | STREAM } [ IF NOT EXISTS ] <object_name>
  CLONE <source_object_name>
        [ { AT | BEFORE } ( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> } ) ]
  ...

その他のスキーマオブジェクト

CREATE [ OR REPLACE ] { STAGE | FILE FORMAT | SEQUENCE | TASK } [ IF NOT EXISTS ] <object_name>
  CLONE <source_object_name>
  ...

一般的な使用上の注意

  • クローンは書き込み可能で、そのソースから独立しています(つまり、ソースまたはクローンに加えられた変更は、他のオブジェクトには反映されません)。

  • ソースデータベース、スキーマ、またはテーブルに明示的に設定されたパラメーターは、ソースコンテナーまたは子オブジェクトから作成されたすべてのクローンに保持されます。

  • クローンを作成するには、現在のロールに、ソースオブジェクトに対する次の権限が必要となります。

    テーブル

    SELECT

    パイプ、ストリーム、タスク

    OWNERSHIP

    その他のオブジェクト

    USAGE

    さらに、スキーマまたはスキーマ内のオブジェクトをクローンするには、現在のロールに、ソースとクローンの両方のコンテナーオブジェクトに対する必要な権限を有していなければなりません。

  • データベースとスキーマの場合、クローンは再帰的です。

    • データベースのクローンを作成すると、データベース内のスキーマおよび他のオブジェクトすべてをクローンします。

    • スキーマのクローンを作成すると、スキーマに含まれるオブジェクトすべてをクローンします。

    ただし、次のオブジェクトタイプはクローン されません

    • 外部テーブル

    • 内部(Snowflake)ステージ

  • データベース、スキーマ、およびテーブルの場合、クローンは、既存のデータを変更する、または新しいデータを追加する操作がクローンで実行されるまで、オブジェクトのデータストレージ全体に寄与 しません

    • クローンテーブルの行を追加、削除、または変更します。

    • クローンされたスキーマに新しいデータを入力したテーブルを作成します。

  • テーブルのクローンを作成すると、ソーステーブルの構造、データ、およびその他の特定のプロパティ( STAGE FILE FORMAT など)がクローンされます。クローンテーブルには、ソーステーブルのロード履歴が 含まれません 。ソーステーブルにロードされたデータファイルは、クローンに再度ロードできます。

  • CREATE TABLE ... CLONE 構文には、次のように新しいテーブルクローンに影響を与える COPY GRANTS キーワードが含まれています。

    • COPY GRANTS キーワードを使用すると、新しいオブジェクトのクローンは、元のテーブルに付与された明示的なアクセス権限を継承しますが、スキーマ内のオブジェクト型で定義された将来の付与は継承 しません

    • COPY GRANTS キーワードを使用 しない 場合、新しいオブジェクトのクローンは、元のテーブルに付与された明示的なアクセス権限を継承しませんが、スキーマ内のオブジェクト型で定義された将来の付与は継承します(GRANT <権限> ... TO ROLE ... ON FUTURE 構文を使用)。

  • メタデータについて。

    注意

    Snowflakeサービスを使用する場合、お客様は、個人データ(ユーザーオブジェクト向け以外)、機密データ、輸出管理データ、またはその他の規制されたデータがメタデータとして入力されていないことを確認する必要があります。詳細については、 Snowflakeのメタデータフィールド をご参照ください。

オブジェクトのクローンに適用される追加の規則

メタデータ

オブジェクトクローンは、 Time Travel を使用して、CREATE <オブジェクト> CLONE ステートメントの実行時または過去の指定された時間/ポイントの 名前 および 構造 を継承します。オブジェクトクローンは、Time Travelが使用されているかどうかに関係なく、ステートメントの実行時にソースオブジェクトで現在使用されているコメントやテーブルクラスタリングキーなどの他のメタデータを継承します。

子オブジェクト

データベースまたはスキーマのクローンには、ステートメントの実行時または過去の指定された時間/ポイントでアクティブなすべての子オブジェクトが含まれます。テーブルデータのスナップショットは、ステートメントが実行されたとき、または過去の指定された時間/ポイントでソースデータの状態を表します。子オブジェクトは、ステートメントの実行時にソースの子オブジェクトの名前と構造を継承します。

クローンされません

データベースまたはスキーマのクローンを作成しても、データベースまたはスキーマ内の次のタイプのオブジェクトはクローン されません

  • 外部テーブル

  • 内部(Snowflake)ステージ

パイプ

データベースまたはスキーマのクローンには、外部(Amazon S3、Google Cloud Storage、またはMicrosoft Azure)ステージを参照するパイプオブジェクトのみが含まれます。内部(Snowflake)パイプはクローンされません。

パイプクローンのデフォルトの状態は次のとおりです。

  • AUTO_INGEST = FALSE の場合、クローンされたパイプはデフォルトで一時停止します。

  • AUTO_INGEST = TRUE の場合、クローンされたパイプは STOPPED_CLONED 状態に設定されます。この状態では、パイプは新しくステージングされたファイルの結果としてイベント通知を蓄積しません。パイプが明示的に再開されると、新しいイベント通知の結果としてトリガーされたデータファイルのみを処理します。

ALTER PIPE ... RESUME ステートメントを実行すると、どちらの状態のパイプクローンも再開できます。

タグ

データベースまたはスキーマのクローンを作成すると、そのデータベースまたはスキーマの タグ に次の影響が及びます。

  • ソースオブジェクトにあるタグの関連付けは、複製されたオブジェクトで維持されます。

  • データベースまたはスキーマでクローン操作を実行すると、そのデータベースまたはスキーマに保存されているタグもクローンされます。

  • クローン作成後、ソースデータベースまたはスキーマ内にあるオブジェクトとそのタグの関連付けは同じままです。複製されたデータベースまたはスキーマでは、オブジェクトとそのタグの関連付けは、複製されたデータベースとスキーマに固有です。

テーブルデータ

データベース、スキーマ、またはテーブルのクローンを作成すると、各テーブルのデータのスナップショットが作成され、クローンで使用できるようになります。スナップショットは、ステートメントの実行時または過去の指定された時間/ポイント(Time Travel を使用)でのソースデータの状態を表します。

オブジェクト参照

ビュー、ストリーム、タスクなどのオブジェクトの定義には、オブジェクト参照が含まれています。たとえば、ビューにはテーブル参照を含む保存されたクエリが含まれています。ストリームはソーステーブルをポイントします。タスクは、ストアドプロシージャを呼び出すか、他のオブジェクトを参照するSQLステートメントを実行します。他にも様々あります。

これらのオブジェクトの1つが、クローンされたデータベースまたはスキーマで、または個別のオブジェクトとしてクローンされると、クローニングをサポートするオブジェクトタイプに対して、ソースオブジェクトの定義から他のオブジェクトへの参照を継承します。たとえば、ビューのクローンは、クエリ内のテーブル参照を含め、ソースビューから保存されたクエリを継承します。

ソースオブジェクトの定義内のオブジェクト名が完全にまたは部分的に修飾されているかどうかに細心の注意を払ってください。完全修飾名には、データベース名とスキーマ名が含まれます。ソースオブジェクトのクローンでは、これらの部分が独自の定義に含まれています。

例:

-- Create a schema to serve as the source for a cloned schema.
CREATE SCHEMA source;

-- Create a table.
CREATE TABLE mytable (col1 string, col2 string);

-- Create a view that references the table with a fully-qualified name.
CREATE VIEW myview AS SELECT col1 FROM source.mytable;

-- Retrieve the DDL for the source schema.
SELECT GET_DDL ('schema', 'source', true);

+--------------------------------------------------------------------------+
| GET_DDL ('SCHEMA', 'SOURCE', TRUE)                                       |
|--------------------------------------------------------------------------|
| create or replace schema MPETERS_DB.SOURCE;                              |
|                                                                          |
| create or replace TABLE MPETERS_DB.SOURCE.MYTABLE (                      |
|   COL1 VARCHAR(16777216),                                                                                                                                                     |
|   COL2 VARCHAR(16777216)                                                                                                                                                     |
| );                                                                       |
|                                                                          |
| CREATE VIEW MPETERS_DB.SOURCE.MYVIEW AS SELECT col1 FROM source.mytable; |
|                                                                          |
+--------------------------------------------------------------------------+

-- Clone the source schema.
CREATE SCHEMA source_clone CLONE source;

-- Retrieve the DDL for the clone of the source schema.
-- The clone of the view references the source table with the same fully-qualified name
-- as in the view in the source schema.
SELECT GET_DDL ('schema', 'source_clone', true);

+--------------------------------------------------------------------------------+
| GET_DDL ('SCHEMA', 'SOURCE_CLONE', TRUE)                                       |
|--------------------------------------------------------------------------------|
| create or replace schema MPETERS_DB.SOURCE_CLONE;                              |
|                                                                                |
| create or replace TABLE MPETERS_DB.SOURCE_CLONE.MYTABLE (                      |
|   COL1 VARCHAR(16777216),                                                                                                                                                   |
|   COL2 VARCHAR(16777216)                                                                                                                                                   |
| );                                                                             |
|                                                                                |
| CREATE VIEW MPETERS_DB.SOURCE_CLONE.MYVIEW AS SELECT col1 FROM source.mytable; |
|                                                                                |
+--------------------------------------------------------------------------------+

他の データベースまたはスキーマ内の同じ名前のテーブルをビューにポイントする場合は、既存のビューのクローンを作成するのではなく、新しいビューを作成することをお勧めします。このガイダンスは、定義内のオブジェクトを参照する他のオブジェクトにも関係します。

注釈

  • クローン操作には特定の制限が適用されます。例えば、クローン操作中にソースオブジェクトに影響を与える DDL ステートメントは、結果を変更したり、エラーの原因となったりする可能性があります。

  • 特に大きなオブジェクト(データベース、スキーマ、テーブル)の場合、クローン作成は瞬時に行われず、クローン作成中のオブジェクトはロックされません。そのため、クローン操作がまだ実行されている間、クローンは、該当する場合、テーブルデータに適用される DML ステートメントを反映しません。

この操作およびクローンの作成操作に影響する可能性のあるその他の使用例の詳細については、 クローニングに関する考慮事項 をご参照ください。

Time Travelを使用したクローンの作成に関する注意事項(データベース、スキーマ、テーブル、およびストリームのみ)

  • AT | BEFORE 句は、過去の指定した時点、または指定した SQL ステートメントに基づいて、データベース、スキーマ、テーブル、またはストリームをクローンします。

    • AT キーワードは、指定されたパラメーターに等しいタイムスタンプを持つステートメント、またはトランザクションによる変更がリクエストに含まれることを指定します。

    • BEFORE キーワードは、リクエストが、指定されたパラメーターの直前のポイントを参照するように指定します。

  • STATEMENT を使用したクローンの作成は、指定されたステートメント ID で識別される、 SQL ステートメント(またはそのトランザクションを囲むトランザクション)の記録された実行時間に等しい値で TIMESTAMP を使用するのと同等です。

  • 次の場合にエラーが返されます。

    • クローン作成中のオブジェクトは、 AT | BEFORE 句で指定された過去の時点では存在していませんでした。

    • オブジェクトまたはその子オブジェクト(クローンスキーマまたはデータベース内のテーブルなど)のクローンを作成するために必要な履歴データはパージされました。

  • AT | BEFORE 句で指定された過去の時点で、クローン化されたデータベースまたはスキーマ内の子オブジェクトが存在しなかった場合、子オブジェクトはクローン化されません。

詳細については、 Time Travelの理解と使用 をご参照ください。

データベースおよびデータベース内のすべてのオブジェクトを現在の状態でクローンします。

CREATE DATABASE mytestdb_clone CLONE mytestdb;

現在の状態でスキーマとスキーマ内のすべてのオブジェクトをクローンします。

CREATE SCHEMA mytestschema_clone CLONE testschema;

現在の状態でテーブルをクローンします。

CREATE TABLE orders_clone CLONE orders;

指定されたタイムスタンプの日付と時刻の前に存在していたスキーマをクローンします。

CREATE SCHEMA mytestschema_clone_restore CLONE testschema BEFORE (TIMESTAMP => TO_TIMESTAMP(40*365*86400));

指定されたタイムスタンプの日付と時刻に正確に存在するテーブルをクローンします。

CREATE TABLE orders_clone_restore CLONE orders AT (TIMESTAMP => TO_TIMESTAMP_TZ('04/05/2013 01:02:03', 'mm/dd/yyyy hh24:mi:ss'));

指定されたステートメント(クエリ ID)の実行直前に存在していたテーブルをクローンします。

CREATE TABLE orders_clone_restore CLONE orders BEFORE (STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726');