カテゴリ:

データベース、スキーマ、共有 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は永続テーブルと一時テーブルのクローン作成のみをサポートします。仮テーブルはクローンできません。

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

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

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

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

    • 外部テーブル

    • 内部(Snowflake)ステージ

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

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

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

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

  • テーブルのクローンを作成する場合、 CREATE <オブジェクト> コマンド構文には COPY GRANTS キーワードが含まれます。

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

    • CREATE <オブジェクト> ステートメントで COPY GRANTS オプションが指定されている場合、新しいオブジェクトは元のテーブルで付与された明示的なアクセス権限を継承しますが、スキーマ内のオブジェクトタイプで定義された将来の付与は継承 しません

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

メタデータ

クローンは、クローンの作成時にソースオブジェクトの 現行 メタデータ定義を継承します。定義には、現在のオブジェクト名、コメント、その他のプロパティなどが含まれます。これは、 Time Travel を使用して、過去のある時点/時点でテーブル、スキーマ、およびデータベースをクローンする場合に注意する必要があります。例えば、テーブルのクローンを作成するときに、以前のバージョンのテーブルで列の名前を変更、追加、またはドロップした場合、クローンは以前のメタデータではなく、クローン文の実行時に列のメタデータを継承します。

子オブジェクト

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

クローンされていません

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

  • 外部テーブル

  • 内部(Snowflake)ステージ

パイプ

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

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

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

次のコマンドを実行すると、どちらの状態のクローンパイプも再開できます。

テーブルデータ

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

注釈

  • クローン操作には特定の制限が適用されます。例えば、クローン操作中にソースオブジェクトに影響を与える 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');