バックアップと不変ストレージのスナップショット¶
スナップショットは、組織が重要なデータを変更や削除から保護するのに役立ちます。
スナップショットは、Snowflakeオブジェクトの個別のバックアップを表します。バックアップするオブジェクト、バックアップする頻度、バックアップを保持する期間、および早期に削除されないように保持ロックを追加するかどうかを選択します。
スナップショットのユースケース¶
以下のユースケースは、スナップショットの一般的なアプリケーションです。
- 規制コンプライアンス:
- 保持ロックを使用したスナップショットは、組織、金融機関、および関連業界が、記録を不変形式で保持することを要求する規制に対処するのに役立ちます。 - 重要 - パブリックプレビュー機能は、特定の規制に認定されていません。Snowflakeは、この機能が一般に利用可能になったときに、コンプライアンス認証を取得する予定です。 
- 復旧:
- スナップショットは、偶発的な変更または削除が発生した場合に、組織が個別のバックアップを作成して、ビジネスクリティカルなデータを保護および回復するのに役立ちます。 
- サイバーの回復力:
- リテンションロックを使用したスナップショットは、全体的なサイバー回復戦略の一部です。これらは、サイバー攻撃、特にランサムウェア攻撃時に組織がビジネスクリティカルなデータを保護するのに役立ちます。保持ロックにより、攻撃者が ACCOUNTADMIN または ORGADMIN ロールを使用してアカウントにアクセスした場合でも、このデータを削除することはありません。 
主な概念¶
このセクションでは、Snowflakeのスナップショットの主な概念の概要を説明します。
スナップショット¶
スナップショット は、オブジェクトの ポイントインタイムバックアップ を表します。
- オブジェクトは、単一のテーブル、スキーマ、またはデータベース全体のいずれかです。 
- 特定のスナップショットはSnowflakeによって生成された一意の ID で識別できます。 
- スナップショットは変更できません。ただし、削除でき、スナップショットの有効期限は変更できます(保持ロック が適用されていない場合に限ります)。 
日常業務では、個々のスナップショットを操作することはほとんどありません。代わりに、それらを含む スナップショットセット を管理します。例えば、SHOWSNAPSHOTSINSNAPSHOTSET コマンドを実行すると、スナップショットのリストを取得します。ALTERSNAPSHOTSET コマンドを実行して新しいスナップショットを作成します。
Tip
Snowflakeは、ブロックストレージボリュームや複製リフレッシュ中に転送されたデータ量など、他のコンテキストでは スナップショット という用語を使用します。スナップショット機能を他の種類のスナップショットと区別する必要がある場合は、* WORM スナップショット*を参照します。これは、1回更新して大量を読み取ることを意味します。特に、 CREATESNAPSHOT, ALTERSNAPSHOT, DROPSNAPSHOT, SHOWSNAPSHOTSおよび DESCRIBESNAPSHOTS ステートメントはすべて、他の種類のスナップショットに適用されます。
スナップショットセット¶
スナップショットセット は、特定のデータベース、スキーマ、またはテーブルのスナップショットのセットを含んでいるスキーマレベルのオブジェクトです。Snowflakeには SQL コマンド CREATE, ALTER, DROP, SHOWおよび DESCRIBE スナップショットセットがあります。
同じオブジェクトに対して複数のスナップショットセットを持つことができます。パブリックプレビュー中は、同じオブジェクトのスナップショットセット数に制限があります。詳細については、 パブリックプレビュー期間中のスナップショットの制限 をご参照ください。
セット内のスナップショットのライフサイクルは、スナップショットセットに添付できるオプションの スナップショットポリシー によって決定されます。スナップショットセットにスナップショットを手動で追加または削除することもできます。スナップショットを削除する機能は、他の要因、特に 保持ロック と 法的保持 の影響を受けます。
スナップショットポリシー¶
スナップショットポリシー は、スナップショットセット内のスナップショットのライフサイクルを定義する設定を含むスキーマレベルのオブジェクトです。これらの設定には、スケジュール、有効期限、保持ロックが含まれます。
- スケジュール は、スナップショットがいつ作成されるかを決定します。スケジュールは、分単位の間隔として、またはcron式として定義できます。たとえば、スケジュールが1時間に設定されている場合、オブジェクトのスナップショットは60分ごとに作成されます。 
- 有効期間 は、スナップショットが有効な時間の長さです。スナップショットの有効期限が切れると、その特定のスナップショットに法的保持が適用されない限り、Snowflakeは自動的に削除します。 - Tip - スナップショットセットに保持ロックがなく、特定のスナップショットに法的保持が適用されていない場合は、有効期限が終了する前にスナップショットを手動で削除できます。手動で1度にスナップショットを削除することができます。その際は、常に法的保持を持たない最も古いスナップショットから始めます。 
各スナップショットポリシーには、スケジュールと有効期限プロパティのどちらかまたは両方が必要です。たとえば、スケジュールと有効期限付きのポリシーを作成し、そのポリシーが適用されるすべてのスナップショットセットのスナップショットのすべての作成と削除をSnowflakeに許可することができます。または、古いスナップショットの削除を自分で管理する場合は、スケジュールありの有効期限なしのポリシーを作成することもできます。あるいは、有効期限があるがスケジュールがないポリシーを作成し、スナップショットの作成を自分で管理することもできます。スケジュールなし、有効期限なしのポリシーは作成できません。
スナップショットポリシーをスナップショットセットに関連付ける場合は、スナップショットセットの作成時に実行するか、後でポリシーを適用できます。あるいは、スナップショットポリシーが関連付けられていないスナップショットセットを使用することもできます。その場合は、新しいスナップショットを取得するタイミングと古いスナップショットを期限切れにするタイミングを手動で制御します。
スナップショットポリシーは複数のスナップショットセットに適用できます。スナップショットポリシーを変更すると、Snowflakeはそのポリシーがアタッチされているすべてのスナップショットセットに変更を適用します。
保持ロック¶
保持ロック は、定義された有効期限の間、スナップショットを削除から保護します。規制コンプライアンスとサイバー回復のためのバックアップ用に保持ロック付きのスナップショットを使用できます。保持ロックを使用したスナップショットセットには、次の制限が適用されます。
- スナップショットは、 ACCOUNTADMIN ロールを含む、どのロールでも削除できません。 
- スナップショットの有効期限を減らすことはできませんが、有効期限を増やすことはできます。 
- 期限が切れていないスナップショットが含まれている場合、そのスナップショットセットをドロップすることはできません。 
- 期限切れのスナップショットを含むスナップショットセットを含むスキーマをドロップすることはできません。 
- 期限切れのスナップショットがあるスナップショットセットを含むデータベースをドロップすることはできません。 
- 期限切れのスナップショットがあるスナップショットセットのデータベースを含むアカウントをドロップすることはできません。 
重要
リテンションロックを持つスナップショットポリシーをスナップショットセットに適用することは できません。規制コンプライアンスに必要な強力な保証により、スナップショットセットに保持ロックを掛けた後は、ロックを取り消すことができません。Snowflake サポートもそのような保持ロックを取り消すはできません。削除できないスナップショットセットとそれを含むスキーマとデータベースの予期しないストレージ料金を回避するために、有効期間のスナップショットスナップショットセットに保持ロックを設定する前に慎重に計画してください。
Snowflake組織が削除された場合、その組織はSnowflakeの顧客ではなくなります。この場合、Snowflakeは保持ロックを持つスナップショットを含むすべてのスナップショットを削除します。Snowflake組織を削除するには、Snowflakeサポートの関与が必要です。これは、管理者が誤って実行できるものではありません。
法的保持¶
Snowflakeスナップショットの 継続的保持 機能は、スナップショットが上書きされたり削除されたりするのを防ぎます。そうすることで、独自の法的要件に基づいてSnowflakeデータベース、スキーマ、またはテーブルを保持できます。
Snowflakeを使用すると、特定のスナップショットに法的保持を配置できます。Snowflakeスナップショットが保持される場合は、以下の条件が適用されます:
- 誰もスナップショットを変更できません。 
- 誰もスナップショットを削除できません。これは、スナップショットが EXPIRE_AFTER_DAYS ピリオドを経過した場合でも当てはまります。 
- スナップショットへのアクセスはログに記録され、監査可能です。 
- 法的保持は、保持ロックとは異なり、権限ユーザーによって削除できます。 
重要
スナップショットセットを複製する場合は、そのスナップショットセットのスナップショットに法的保持を絞った後、すぐにリフレッシュを実行するようにしてください。法的保持を含むスナップショットセットを複製する前にフェールオーバーを実行すると、元のプライマリアカウントにフェールバックするときに元のスナップショットセットが上書きされ、法的保持が消去される可能性があります。
スナップショットライフサイクルの概要¶
次の図は、Snowflakeオブジェクト、スナップショット、スナップショットセット、およびスナップショットポリシーが互いにどのように関連するかを示しています。この図には、単一のテーブルに対する1つの最も単純な種類のスナップショットが含まれています。バックアップ操作ごとに、新しいスナップショットが作成されます。その特定のオブジェクトのすべてのスナップショットは、スナップショットセットでグループ化されます。スナップショットセット内のスナップショットの自動追加と削除は、スナップショットポリシー に管理されます。スナップショットから情報を回復するには、CREATE 特定のスナップショットから新しい オブジェクトを作成するコマンドを使用します。
 
スナップショットの仕組み¶
スナップショットは、 クローン に類似したSnowflakeオブジェクトの ゼロコピー バックアップです。スナップショットは、作成時にテーブルデータのコピーを作成しません。スナップショットメカニズムは、データのコピーにかかる追加のコストや時間を発生させずに、テーブルデータをバックアップします。
Snowflakeは不変のファイルにデータを格納し、スナップショットからテーブルの基礎となるデータファイルへのポインターを維持します。テーブルが進化して変更されると、Snowflakeは、そのファイルを参照する期限切れのスナップショットがある限り、各データファイルが削除から保護されるようにします。
スナップショットの制限¶
Snowflakeは、スナップショットに次の制限を適用します:
- スナップショットポリシーの保持ロックは変更できません。 
- ポリシーに保持ロックがある場合は、有効期限を増やすことはできますが、減らすことはできません。 
- スケジュールされたスナップショットの最小スケジュール間隔は1時間(60分間)です。 
パブリックプレビュー期間中のスナップショットの制限¶
スナップショット機能が一般に利用可能になると、次の制限が変更される可能性があります:
- スナップショットに定期的なスケジュールを設定すると、Snowflakeはスケジュールされたスナップショットの頻度に基づいて最大保持期間を課します。スナップショットポリシーでは、 EXPIRE_AFTER_DAYS プロパティは、関連する SCHEDULE プロパティに基づいて制限されます。 - 60〜119分の頻度のスナップショットポリシーには、最大 EXPIRE_AFTER_DAYS 値は90です。 
- 120分から23時間および59分の頻度のスナップショットポリシーは、最大 EXPIRE_AFTER_DAYS 値は180です。 
- 24時間以上の頻度を持つスナップショットポリシーの最大 EXPIRE_AFTER_DAYS 値は366です。 
- スケジュールのないスナップショットポリシーの最大 EXPIRE_AFTER_DAYS 値は3653です。 
 
- 特定のデータベースに対して最大2つのデータベーススナップショットセットを作成できます。同様に、特定のスキーマに対して最大2つのスキーマスナップショットセットを作成し、特定のテーブルに対して2つのテーブルスナップショットセットを作成できます。オブジェクトは、2つ以上のスナップショットセットに引き続き表示される可能性があります。たとえば、テーブルには1つまたは2つの関連するテーブルスナップショットセットが含まれる場合があります。同じテーブルが1つまたは2つのスキーマスナップショットセット、1つまたは2つのデータベーススナップショットセットに含まれる場合もあります。 
- スナップショットポリシーがスナップショットセットに適用された後は、そのスナップショットセットからポリシーを削除できません。 
スナップショットと他の障害復旧およびビジネス継続性機能との比較¶
スナップショットには、複製やTime Travelなどの他のビジネス継続性および障害復旧機能とは異なる次の利点があります:
- スナップショットの長期保持を有効にすることができます。長期の保持は、ランサムウェアやイン内部攻撃などの脅威に対する回復、規制コンプライアンス、サイバー回復力に役立ちます。 
- 保持ロックにより、アカウント管理者を含むどのユーザーもスナップショットを削除できません。 
- 複製のリフレッシュなど、他のデータ転送操作に使用する時間とは異なる時間枠でスナップショットをスケジュールできます。 
- 個々のテーブルオブジェクト、またはスキーマ全体やデータベースなどのコンテナオブジェクトのスナップショットを使用して復元できます。 
- 保持ロックを含むスナップショットポリシーを使用すると、バックアップの保持時間が短縮されるのを防ぐことができます。これは、保持間隔をゼロに縮小できるTime Travel機能とは異なります。 
- Time TravelやFail-safeとは異なり、スナップショットはテーブルやテーブルデータだけでなく、さまざまな種類のオブジェクトからのデータを保持します。 
- バックアップを取る速度とストレージ効率は、クローンに使用されるゼロコピーメカニズムと似ています。 
- 同じオブジェクトのすべてのスナップショットがスナップショットセットにグループ化される方法は、クローンを使用して独自のバックアップメカニズムを実装する場合よりも管理が簡単になります。たとえば、多数のオブジェクトを管理したり、クローンされたオブジェクトを追跡するための命名スキームを用意したり、古いクローンを削除するためのスケジューリングメカニズムを実装したりする必要はありません。また、クローンオブジェクトとは異なり、スナップショットは作成後に変更することはできません。 
- 各スナップショットは、指定された時点での単一のテーブル、スキーマ、またはデータベースを表します。スナップショットには、ユーザーやロールなどのアカウントレベルのオブジェクトは含まれません。一部の種類のテーブルやその他のデータベースレベルのオブジェクトは、スキーマやデータベーススナップショットに含まれません。詳細については、:ref:` スナップショットオブジェクト <label-snapshot_objects>`をご参照ください。 
- スナップショット関連のオブジェクトは、関連するデータベース、スキーマ、またはテーブルと同じクラウドサービスプロバイダー(CSP)リージョンに保存されます。ビジネス継続性と障害復旧のシナリオでは、通常、スナップショットと Snowflakeアカウント複製を組み合わせます。これにより、すべてのスナップショットセットとスナップショットポリシーを別のリージョンまたは別の CSP に複製でき、元のリージョンまたは CSP に影響を与える停止が発生した場合でも、および は復旧されました。 
- スナップショットセットとスナップショットポリシーはクローンできません。そのようなオブジェクトを含むスキーマやデータベースをクローンした場合、それらはクローンされたスキーマやデータベースには含まれません。 
スナップショットオブジェクト¶
テーブル、スキーマ、データベースのスナップショットセットを作成できます。
テーブルから他のオブジェクトへの参照¶
ビューや関数などのオブジェクトは、スナップショット内のスキーマやデータベースの外部にあるオブジェクトを参照できます。スナップショットから復元する後も、そのような参照が引き続き機能するようにするには、以下のいずれかの戦略を使用します:
- テーブルとそれらが参照するその他のオブジェクトがすべて同じスキーマまたは同じデータベースにある場合は、スキーマまたはデータベース全体のスナップショットセットを作成します。そうすれば、Snowflakeはスナップショットから復元する際に、相互接続されたすべてのオブジェクトを一度に復元します。 
- スナップショットセット内のオブジェクトがスナップショットセットに含まれていないオブジェクトを参照している場合は、スナップショットが復元されると、復元されたオブジェクトからの参照は他のデータベースまたはスキーマにある元のオブジェクトをポイントすることに注意してください。スナップショットの取得後に、これらの他のオブジェクトをドロップしたり、プロパティを変更したりすると、復元されたオブジェクトにアクセスするとエラーが発生する可能性があります。 
- アカウントレベルのオブジェクトの場合、復元されたオブジェクトからの参照は*すべて*、元のアカウントレベルのオブジェクトを指します。これは、アカウントレベルのオブジェクトがスナップショットの一部ではないためです。たとえば、スキーマスナップスナップショットには、セキュリティ統合を参照するシークレットが含まれている場合があります。セキュリティ統合はアカウントレベルのオブジェクトであり、スナップショットに含めることはできません。 
データベースとスキーマのオブジェクトのスナップショット¶
次のテーブルは、データベースまたはスキーマのスナップショットに含まれるオブジェクトのリストです:
| オブジェクト | スナップショットに含まれています | メモ | 
|---|---|---|
| 永続テーブル | 有り | テーブルのTime Travel情報は、スナップショットの一部としては保存されません。 | 
| 一時テーブル | 有り | このようなテーブルは、復元する後も一時テーブルであり続けます。一時スキーマや一時データベースは、復元する後も一時プロパティを保持します。 | 
| 仮テーブル | 無し | 仮テーブルはセッション・スコープであり、スナップショットには含まれません。 | 
| 動的テーブル | 有り | 動的テーブルにはスナップショットの独自のデータ定義言語(DDL)構文を使用します。CREATESNAPSHOTSETFORDYNAMICTABLE および CREATEDYNAMICTABLEFROMSNAPSHOTSET コマンドを実行できます。スナップショットから動的テーブルを復元すると、Snowflake :ref:` は最初のリフレッシュ時に新しいテーブル <label-dynamic_tables_initialization>` を自動的に初期化します。 | 
| 外部テーブル | 無し | |
| ハイブリッドテーブル | 無し | |
| Apache Iceberg™ tables | 無し | |
| テーブルの制約 | 有り | |
| イベントテーブル | 無し | |
| シーケンス | 有り | |
| ビュー | 有り | |
| マテリアライズドビュー | 無し | |
| セキュアビュー | 有り | |
| ファイル形式 | 有り | |
| 内部ステージ | 無し | |
| 外部ステージ | 無し | |
| 仮ステージ | 無し | |
| ディレクトリテーブル | 無し | |
| パイプ | 無し | |
| ストアドプロシージャ | 有り | SQL、Javascript、 Python、Java、Scalaプロシージャはすべてサポートされています。 | 
| ユーザー定義関数(UDFs) | 有り | SQL、Javascript、 Python、Java、Scala関数はすべてサポートされています。スカラー関数 UDFs およびユーザー定義のテーブル関数(UDTFs)は両方ともスナップショットに含まれています。スナップショットのJava UDFs は、クローニングの制限 と同じ要件があります。 | 
| ストリーム | 無し | |
| タスク | 有り | タスクはスナップショットに含まれています。スナップショットから復元されたタスクは中断され、再開する必要があります。 | 
| データメトリック関数(DMFs) | 無し | |
| ポリシー | 有り | 次の種類のポリシーは、スキーマまたはデータベーススナップショットに含まれます: 
 スナップショットに含まれるテーブルに、集約ポリシーや投影ポリシーなど他の種類のポリシーが適用されている場合、スナップショットの作成は失敗します。 | 
| 付与 | 有り | ロールをドロップすると、関連する所有権の付与は DROPROLE コマンドを実行するロールに転送されます。この場合、所有権以外の付与は削除されます。したがって、復元されたオブジェクトへの付与は、スナップショットの作成時に存在していた付与とは異なる場合があります。 | 
| データベースロール | 無し | |
| オブジェクトのタグ付け | 有り | |
| アラート | 有り | |
| ネットワークルール | 有り | |
| Githubリポジトリ | 無し | |
| モデル | 無し | |
| モデルモニター | 無し | |
| データセット | 無し | |
| Notebooks | 無し | |
| 連絡先 | 無し | |
| Cortex検索サービス | 無し | |
| dbtプロジェクト | 無し | |
| イメージリポジトリ | 無し | |
| リスト | 無し | |
| 組織リスト | 無し | |
| パイプ | 無し | |
| ポリシー(集約) | 無し | |
| ポリシー(認証) | 無し | |
| ポリシー(機能) | 無し | |
| ポリシー(結合) | 無し | |
| ポリシー(パッケージ) | 無し | |
| ポリシー(パスワード) | 無し | |
| ポリシー(プライバシー) | 無し | |
| ポリシー(投影) | 無し | |
| ポリシー(セッション) | 無し | |
| プロビジョニングされたスループット | 無し | |
| セマンティックビュー | 無し | |
| サービス | 無し | |
| Streamlits | 無し | 
Snowflakeがオブジェクトとスナップショットセットを関連付ける方法¶
データベース、スキーマ、またはテーブルのスナップショットセットを作成すると、Snowflakeはスナップショットセットをそのデータベース、スキーマ、またはテーブルの内部 ID に関連付けます。元のオブジェクトを削除すると、そのスナップショットセットにスナップショットを追加することはできません。この動作は、同じ名前のオブジェクトを再作成したり、スナップショットから復元されたオブジェクトと置き換えたりした場合にも適用されます。
代わりに元のオブジェクトの名前を変更した場合は、同じスナップショットセットにスナップショットを追加して、そのオブジェクトのバックアップを引き続き作成できます。その場合、SHOWSNAPSHOTSETS の出力は、名前が変更されたオブジェクトの OBJECT_NAME 値を反映するように変更されます。
テーブルのバックアップを作成したいが、そのテーブルを頻繁に削除して再作成する場合 CREATEORREPLACE ステートメントを実行する場合は、テーブルを含むスキーマまたはデータベースのスナップショットセットに含めます。そうすることで、テーブルの変更に関係なく、同じスナップショットセットを使い続けることができます。
スナップショットからテーブルを復元すると、復元されたテーブルは元の名前とは異なる名前で起動します。元のテーブルの内容をスナップショットデータで完全に置き換え、同じテーブルのさらなるバックアップには同じスナップショットセットを使用し続けると想定します。その場合は、元のテーブルの内容を削除するには TRUNCATE または DELETE ステートメントを使用し、復元されたテーブルからデータをコピーするには INSERT ... SELECT ステートメントを使用します。元のテーブルはドロップしないで、復元されたテーブルの名前を元のテーブルの名前に変更します。
スナップショットと暗号化¶
スナップショットセット内のデータは、他のSnowflakeオブジェクトやテーブルデータと同じエンドツーエンドの暗号化によって保護されます。Snowflakeの暗号化の詳細については、Snowflakeのエンドツーエンド暗号化について をご参照ください。
キーのローテーションは、スナップショット内のデータにも適用されます。
スナップショットとデータ系統¶
Snowflakeは、データベース、スキーマ、テーブルスナップショットを含む データ系統 メタデータを保存しません。スナップショットからオブジェクトを復元した後は、復元されたデータのリネージ情報を表示するために Snowsight は使用できません。
スナップショットのコスト¶
次のテーブルは、スナップショットの料金を説明しています。
| コストコンポーネント | 説明 | パブリックプレビュー中に請求 | 
|---|---|---|
| スナップショットコンピューティング | Snowflake管理のコンピューティングサービスは、スケジュールされたスナップショットの作成と有効期限を生成します。 | 有り | 
| 復元コンピューティング | Snowflake管理のウェアハウスは、スナップショットからオブジェクトを復元するために使用されます。 | 有り | 
| スナップショットストレージ | スナップショットデータを格納するためのSnowflake管理のクラウドオブジェクトストレージ。 | スナップショットで保持されたバイトに対して請求されます。クローンで保持されたバイトと同様です。 | 
スナップショットストレージのコストは TABLE_STORAGE_METRICS を使用した ビュー RETAINED_FOR_CLONE_BYTES 列、および で SNAPSHOT_STORAGE_USAGE ビュー。
アクセス制御権限¶
次のテーブルは、権限と、スナップショットの管理および使用のために権限が付与されるオブジェクト型を示しています。
| 権限 | オブジェクト型 | 説明 | 
|---|---|---|
| CREATE SNAPSHOT POLICY | スキーマ | スキーマにスナップショットポリシー を作成する機能を付与します。この権限を与えるロールには、スキーマに対する USAGE 権限も必要です。 | 
| CREATE SNAPSHOT SET | スキーマ | スキーマにスナップショットセット を作成する機能を付与します。この権限を与えるロールには、スキーマに対する USAGE 権限も必要です。スナップショットセットを実際に作成するには、スナップショットセットのサブジェクトであるオブジェクトに対する適切な権限も必要です。SELECT テーブルスナップショットの場合は、または USAGE スキーマスナップスナップショットまたはデータベーススナップショット用。 | 
| APPLY | スナップショットポリシー | 特定のスナップショットポリシー を適用する機能を付与します。ACCOUNTADMIN ロールを持つユーザーのみがこの権限を付与できます。 | 
| APPLY SNAPSHOT RETENTION LOCK | アカウント | 保持ロックでスナップショットポリシーを作成および適用する機能を付与します。この権限は に付与されます ACCOUNTADMIN ロールおよび は委任できます。 この権限は、ロールが以下を実行できるようにするために必要です。 
 | 
| APPLY LEGAL HOLD | アカウント | スナップショットから法的保持を追加または削除する機能を付与します。デフォルトでは、 ACCOUNTADMIN ロールにこの権限があります。 | 
スナップショットポリシーおよびセットの作成に必要な権限の付与¶
注釈
- これらの権限を付与するために使用されるロールには、スキーマに対する OWNERSHIP 権限、または CREATESNAPSHOTSET もしくは CREATESNAPSHOTPOLICY 権限 WITHGRANTOPTION を持つ必要です。 
- カスタムアカウントロールまたはデータベースロールに次の権限を付与できます。 
ロール myrole にスキーマ myschema でスナップショットポリシーを作成する権限を付与するには、次のステートメントを実行します。
GRANT CREATE SNAPSHOT POLICY ON SCHEMA policy_schema TO ROLE myrole;
スキーマ myschema でスナップショットセットを作成する権限をロール myrole を付与するには、次のステートメントを実行しますː
GRANT CREATE SNAPSHOT SET ON SCHEMA policy_schema TO ROLE myrole;
ロール APPLY へのスナップショットポリシーの権限を付与します¶
注釈
- ACCOUNTADMIN ロールを持つユーザーのみがこの権限を付与できます。 
- この権限は、カスタムアカウントロールまたはデータベースロールに付与できます。 
スナップショットポリシー hourly_snapshot_policy をスナップショットセットに適用するロール myrole を有効にするには、次のステートメントを実行しますː
GRANT APPLY ON SNAPSHOT POLICY hourly_snapshot_policy TO ROLE myrole;
ロールに APPLY SNAPSHOTRETENTION 権限を付与する¶
スナップショットセットに保持ロック付きのスナップショットポリシーを適用する権限をロールに付与できます。
ACCOUNTADMIN ロールを持つユーザーのみがこの権限を付与できます。
重要
リテンションロックを持つスナップショットポリシーをスナップショットセットに適用することは できません。規制コンプライアンスに必要な強力な保証により、スナップショットセットに保持ロックを設定すると、ロックを取り消すはできません。Snowflake サポートもそのような保持ロックを取り消すはできません。保持ロックで作成されたスナップショットは、有効期限が終了するまで削除できません。
Snowflake組織が削除された場合、その組織はSnowflakeの顧客ではなくなります。この場合、Snowflakeは保持ロックを持つスナップショットを含むすべてのスナップショットを削除します。
スナップショットセットに保持ロックを持つスナップショットポリシーを適用するロール``retention_lock_admin_role`` を有効にするには、次のステートメントを実行します。
GRANT APPLY SNAPSHOT RETENTION LOCK ON ACCOUNT TO ROLE retention_lock_admin_role;
スナップショットの作成と構成する¶
このセクションでは、スナップショットを作成および復元するためのワークフロー例を示します。
スケジュールされたスナップショットの作成¶
スケジュールに従って、自動的にスナップショットを作成するスナップショットセットを作成します。
- CREATE SNAPSHOT POLICY コマンドを使用してスナップショットポリシーを作成します。たとえば、次のポリシーは、スナップショットセットの作成時刻から開始して、1時間ごとにスナップショットを作成します。各スナップショットは90日後に期限切れになります。 - CREATE SNAPSHOT POLICY hourly_snapshot_policy SCHEDULE = '60 MINUTE' EXPIRE_AFTER_DAYS = 90 COMMENT = 'Hourly backups expire after 90 days'; 
- テーブル - t1に対して、スナップショットポリシー- hourly_snapshot_policyを用いてスナップショットセットを作成します:- CREATE SNAPSHOT SET t1_snapshots FOR TABLE t1 WITH SNAPSHOT POLICY hourly_snapshot_policy; 
- スキーマ - s1に対してスナップショットポリシー- hourly_snapshot_policyを用いてスナップショットセットを作成します :- CREATE SNAPSHOT SET s1_snapshots FOR SCHEMA s1 WITH SNAPSHOT POLICY hourly_snapshot_policy; 
- データベース - d1に対して、スナップショットポリシー- hourly_snapshot_policyを用いてスナップショットセットを作成します :- CREATE SNAPSHOT SET d1_snapshots FOR DATABASE d1 WITH SNAPSHOT POLICY hourly_snapshot_policy; 
保持ロックを使用したスケジュールされたスナップショットの作成¶
スケジュールの保持ロックでスナップショットを自動的に作成するスナップショットセットを作成します。保持ロックは、権限を持つユーザーであっても、ポリシーがアタッチされているスナップショットセットのスナップショットを削除または変更することはできません。
アカウントの APPLYSNAPSHOTRETENTIONLOCK 権限を持つロールのみが、保持ロックを持つスナップショットポリシーを作成できます。
重要
リテンションロックを持つスナップショットポリシーをスナップショットセットに適用することは できません。規制コンプライアンスに必要な強力な保証により、スナップショットセットに保持ロックを設定すると、ロックを取り消すはできません。Snowflake サポートもそのような保持ロックを取り消すはできません。保持ロックで作成されたスナップショットは、有効期限が終了するまで削除できません。
Snowflake組織が削除された場合、その組織はSnowflakeの顧客ではなくなります。この場合、Snowflakeは保持ロックを持つスナップショットを含むすべてのスナップショットを削除します。
- 有効期限が90日で日次スナップショットを作成する保持ロックを持つポリシーを作成します。 - CREATE SNAPSHOT POLICY daily_snapshot_policy_with_lock WITH RETENTION LOCK SCHEDULE = '1440 MINUTE' EXPIRE_AFTER_DAYS = 90 COMMENT = 'regulatory backups: they have a retention lock and expire after 90 days'; 
- テーブル - t2に対して、スナップショットポリシー- daily_snapshot_policy_with_lockを用いてスナップショットセットを作成します:- CREATE SNAPSHOT SET t2_snapshots FOR TABLE t2 WITH SNAPSHOT POLICY daily_snapshot_policy_with_lock; 
- スキーマ - s2に対してスナップショットポリシー- daily_snapshot_policy_with_lockを用いてスナップショットセットを作成します :- CREATE SNAPSHOT SET s2_snapshots FOR SCHEMA s2 WITH SNAPSHOT POLICY daily_snapshot_policy_with_lock; 
- データベース - d2に対して、スナップショットポリシー- daily_snapshot_policy_with_lockを用いてスナップショットセットを作成します :- CREATE SNAPSHOT SET d2_snapshots FOR DATABASE d2 WITH SNAPSHOT POLICY daily_snapshot_policy_with_lock; 
スナップショットを手動で作成する¶
スナップショットは、いつでもスナップショットセットに手動で追加できます。これを実行すると、スナップショットセットに関連付けられたデータベース、スキーマ、またはテーブルのスナップショットが作成されます。スナップショットセットにスナップショットポリシーによってスケジュールされたスナップショットが含まれているかどうかに関係なく、スナップショットを手動で作成できます。スナップショットセットに関連付けられたスナップショットポリシーがあり、そのポリシーが有効期限を定義している場合、その有効期間は手動スナップショットにも適用されます。
次の例では、テーブルスナップショットセット t1_snapshots を作成し、そして最初のスナップショットを追加します。
CREATE SNAPSHOT SET t1_snapshots FOR TABLE t1;
ALTER SNAPSHOT SET t1_snapshots ADD SNAPSHOT;
次の例では、1時間ごとのバックアップ、テーブルスナップショットセットを使用してスナップショットポリシーを作成します。ポリシーを使用してから、スナップショットセット t2_snapshots に手動スナップショットを追加します。
CREATE SNAPSHOT POLICY hourly_snapshot_policy
  SCHEDULE = '60 MINUTE'
  EXPIRE_AFTER_DAYS = 7;
CREATE SNAPSHOT SET t2_snapshots FOR TABLE t2 WITH SNAPSHOT POLICY hourly_snapshot_policy;
-- Wait several hours. Then the snapshot set already contains several scheduled snapshots.
-- You can manually add a snapshot at any time, in addition to the scheduled snapshots.
ALTER SNAPSHOT SET t2_snapshots ADD SNAPSHOT;
同様のコマンドを実行して、スナップショットをスキーマまたはデータベーススナップショットセットに追加できます。ALTERSNAPSHOTSET コマンドで設定されたスキーマまたはデータベーススナップショットの名前を置き換えます。
スナップショットセットのスナップショットポリシーの中断¶
スナップショットセットのスナップショットポリシーを一時一時停止すると、そのスナップショットポリシーがそのスナップショットセットで新しいスケジュールされたスナップショットを作成するために使用されなくなります。また、スナップショットポリシーを使用するスナップショットセット内の既存のスナップショットの有効期限一時停止する。同じポリシーを使用する他のスナップショットセットは影響を受けません。
次の例では、スナップショットセット t2_snapshots のスナップショットポリシーを中断します:
ALTER SNAPSHOT SET t2_snapshots SUSPEND SNAPSHOT POLICY;
ALTER SNAPSHOT SET コマンドの詳細については、 ALTER SNAPSHOT SET をご参照ください。
スナップショットセットのスナップショットポリシーの再開¶
中断したスナップショットポリシーを再開できます。そうすると、スナップショットポリシーに従ってスナップショットの作成と有効期限が再開されます。ポリシーが中断されている間に有効期限に達したスナップショットがある場合、Snowflakeはポリシーが再開されるとすぐにそれらのスナップショットを削除します。
次の例では、スナップショットセット t1_snapshot のスナップショットポリシーを再開します:
ALTER SNAPSHOT SET t1_snapshots RESUME SNAPSHOT POLICY;
ALTER SNAPSHOT SET コマンドの詳細については、 ALTER SNAPSHOT SET をご参照ください。
スナップショットの復元¶
特定のスナップショットの ID をしようして、スナップショットセットからオブジェクトを復元できます。たとえば、テーブル t1 を復元するには、スナップショットセット t1_snapshots から現在のスキーマで、次のステートメントを実行します。
- 復元するテーブルスナップショット ID を - snapshot_id列で確認します:- SHOW SNAPSHOTS IN SNAPSHOT SET t1_snapshots ->> SELECT "created_on", "snapshot_id", "expire_on" FROM $1; - +-------------------------------+--------------------------------------+-------------------------------+ | created_on | snapshot_id | expire_on | |-------------------------------+------------------------------------------+---------------------------| | 2024-08-19 17:12:28.991 -0700 | 983e0b66-91eb-41cb-8a0b-037abfec1914 | 2024-08-20 17:12:28.991 -0700 | | 2024-08-19 18:12:33.824 -0700 | b5624ef0-1f35-452f-b132-09d8f0592e52 | 2024-08-20 18:12:33.824 -0700 | | 2024-08-19 19:12:43.830 -0700 | eca1a94a-fd40-46db-a2bc-4afba6a38c0a | 2024-08-20 19:12:43.830 -0700 | | 2024-08-19 20:12:45.446 -0700 | 8ee2fd7e-1afe-42e1-acd7-79582765a910 | 2024-08-20 20:12:45.446 -0700 | | 2024-08-19 21:12:55.305 -0700 | d38caf14-f8a5-4ba8-a248-8287e0cdcf40 | 2024-08-20 21:12:55.305 -0700 | +-------------------------------+--------------------------------------+-----------+-------------------+ 
- 復元するスキーマスナップショット ID を - snapshot_id列で確認します:- SHOW SNAPSHOTS IN SNAPSHOT SET s1_snapshots; - +-------------------------------+--------------------------------------+-------------------------------+ | created_on | snapshot_id | expire_on | |-------------------------------+--------------------------------------+-------------------------------| | 2024-08-19 17:12:28.991 -0700 | 0a0382e1-d265-46e9-b152-4c3b2b859e65 | 2024-08-20 17:12:28.991 -0700 | | 2024-08-19 18:12:33.824 -0700 | 8dbcf919-3393-4590-928f-5481d7f2502f | 2024-08-20 18:12:33.824 -0700 | | 2024-08-19 19:12:43.830 -0700 | 8ee2fd7e-1afe-42e1-acd7-79582765a910 | 2024-08-20 19:12:43.830 -0700 | | 2024-08-19 20:12:45.446 -0700 | bd729a79-01bc-444d-a550-adaaa31ab62f | 2024-08-20 20:12:45.446 -0700 | | 2024-08-19 21:12:55.305 -0700 | 9a8802c5-5fbd-4200-a09d-43e046103939 | 2024-08-20 21:12:55.305 -0700 | +-------------------------------+--------------------------------------+-------------------------------+ 
- 復元するデータベーススナップショット ID を - snapshot_id列で確認します:- SHOW SNAPSHOTS IN SNAPSHOT SET d1_snapshots; - +-------------------------------+--------------------------------------+-------------------------------+ | created_on | snapshot_id | expire_on | |-------------------------------+--------------------------------------+-------------------------------| | 2024-08-19 17:12:28.991 -0700 | 42435925-4e77-4b01-ba89-8163ac03e12f | 2024-08-20 17:12:28.991 -0700 | | 2024-08-19 18:12:33.824 -0700 | 29c2c1b9-6599-4f0b-87b8-d43377fd7c77 | 2024-08-20 18:12:33.824 -0700 | | 2024-08-19 19:12:43.830 -0700 | a4283984-a063-4415-acc4-0e3c19259fad | 2024-08-20 19:12:43.830 -0700 | | 2024-08-19 20:12:45.446 -0700 | ffe25397-64b9-4c5f-b061-23a1885dc2dc | 2024-08-20 20:12:45.446 -0700 | | 2024-08-19 21:12:55.305 -0700 | 28e12b8a-aab8-40a8-ae39-9a5a5f654d66 | 2024-08-20 21:12:55.305 -0700 | +-------------------------------+--------------------------------------+-------------------------------+ 
- テーブル - t1用に、2024-08-19 18:12:33 に取得されたスナップショットを復元します:- CREATE TABLE restored_t1 FROM SNAPSHOT SET t1_snapshots IDENTIFIER 'b5624ef0-1f35-452f-b132-09d8f0592e52'; 
- スキーマ - s1用に、2024-08-19 18:12:33 に取得されたスナップショットを復元します:- CREATE SCHEMA restored_s1 FROM SNAPSHOT SET s1_snapshots IDENTIFIER '8dbcf919-3393-4590-928f-5481d7f2502f'; 
- データベース - d1用に、2024-08-19 18:12:33 に取得されたスナップショットを復元します :- CREATE DATABASE restored_d1 FROM SNAPSHOT SET d1_snapshots IDENTIFIER '29c2c1b9-6599-4f0b-87b8-d43377fd7c77'; 
スナップショットセットからのスナップショットの削除¶
スナップショットセットについては、法的保持を持たない最も古いスナップショットのみを削除できます。スナップショット ID を指定して実行します。is_under_legal_hold プロパティを調査すると、法的保持を持たないスナップショットを見つけることができます。created_on プロパティを調べると、最も古いスナップショットを見つけることができます。
注釈
保持ロックを持つスナップショットポリシーがそのスナップショットセットにアタッチされている場合や、その特定のスナップショットスナップショットに法的保持が適用されている場合は、スナップショットセットからスナップショットを削除することはできません。
スナップショットセットから削除するスナップショットは、セット内の最も古いスナップショットである必要があります。
- 削除するテーブルスナップショット ID を次の出力の - snapshot_id列から見つけます。- created_on列で昇順に並べ替えると、最も古いスナップショットが最初に配置されます。SELECT コマンドに``LIMIT 1`` を追加すると、スナップショットの詳細を含む最も古い行のみを返します。- SHOW SNAPSHOTS IN SNAPSHOT SET t1_snapshots ->> SELECT "created_on", "snapshot_id", "expire_on" FROM $1 WHERE "is_under_legal_hold" = 'N' ORDER BY "created_on"; - +-------------------------------+--------------------------------------+-------------------------------+ | created_on | snapshot_id | expire_on | |-------------------------------+--------------------------------------+-------------------------------| | 2024-08-19 17:12:28.991 -0700 | 983e0b66-91eb-41cb-8a0b-037abfec1914 | 2024-08-20 17:12:28.991 -0700 | | 2024-08-19 18:12:33.824 -0700 | b5624ef0-1f35-452f-b132-09d8f0592e52 | 2024-08-20 18:12:33.824 -0700 | | 2024-08-19 19:12:43.830 -0700 | eca1a94a-fd40-46db-a2bc-4afba6a38c0a | 2024-08-20 19:12:43.830 -0700 | | 2024-08-19 20:12:45.446 -0700 | 8ee2fd7e-1afe-42e1-acd7-79582765a910 | 2024-08-20 20:12:45.446 -0700 | | 2024-08-19 21:12:55.305 -0700 | d38caf14-f8a5-4ba8-a248-8287e0cdcf40 | 2024-08-20 21:12:55.305 -0700 | +-------------------------------+--------------------------------------+-------------------------------+ 
- t1_snapshots2024-08-19 17:12:28 に作成されたスナップショットを、- snapshot_idを使用して削除します:- ALTER SNAPSHOT SET t1_snapshots DELETE SNAPSHOT IDENTIFIER '983e0b66-91eb-41cb-8a0b-037abfec1914'; 
- 削除するスキーマスナップショットの ID を次の出力の - snapshot_id列から見つけますː- SHOW SNAPSHOTS IN SNAPSHOT SET s1_snapshots ->> SELECT "created_on", "snapshot_id", "expire_on" FROM $1 ORDER BY "created_on"; - +-------------------------------+--------------------------------------+-------------------------------+ | created_on | snapshot_id | expire_on | |-------------------------------+--------------------------------------+-------------------------------| | 2024-08-19 17:12:28.991 -0700 | 28e12b8a-aab8-40a8-ae39-9a5a5f654d66 | 2024-08-20 17:12:28.991 -0700 | | 2024-08-19 18:12:33.824 -0700 | 46a1e22a-8557-432f-a14c-1261a4ca2b34 | 2024-08-20 18:12:33.824 -0700 | | 2024-08-19 19:12:43.830 -0700 | 3e42fef6-b895-4055-a59f-179744d015d3 | 2024-08-20 19:12:43.830 -0700 | | 2024-08-19 20:12:45.446 -0700 | 7807d24e-285e-4741-b332-87c32bad5cb6 | 2024-08-20 20:12:45.446 -0700 | | 2024-08-19 21:12:55.305 -0700 | e022e619-ee83-45a0-b2b7-9007e284bdb3 | 2024-08-20 21:12:55.305 -0700 | +-------------------------------+--------------------------------------+-------------------------------+ 
- s1_snapshots2024-08-19 17:12:28 に作成されたスナップショットを、- snapshot_idを使用して削除します:- ALTER SNAPSHOT SET s1_snapshots DELETE SNAPSHOT IDENTIFIER '28e12b8a-aab8-40a8-ae39-9a5a5f654d66'; 
- 削除するデータベーススナップショット ID を次の出力の - snapshot_id列から見つけますː- SHOW SNAPSHOTS IN SNAPSHOT SET d1_snapshots ->> SELECT "created_on", "snapshot_id", "expire_on" FROM $1 ORDER BY "created_on"; - +-------------------------------+--------------------------------------+-------------------------------+ | created_on | snapshot_id | expire_on | |-------------------------------+--------------------------------------+-------------------------------| | 2024-08-19 17:12:28.991 -0700 | d3a77432-c98d-4969-91a9-fffae5dd655c | 2024-08-20 17:12:28.991 -0700 | | 2024-08-19 18:12:33.824 -0700 | 0a0382e1-d265-46e9-b152-4c3b2b859e65 | 2024-08-20 18:12:33.824 -0700 | | 2024-08-19 19:12:43.830 -0700 | 25e01ee0-ea9d-4bb7-af7f-f3fe87f9409e | 2024-08-20 19:12:43.830 -0700 | | 2024-08-19 20:12:45.446 -0700 | a12294f5-fc63-49cf-84f1-c7b72f7664af | 2024-08-20 20:12:45.446 -0700 | | 2024-08-19 21:12:55.305 -0700 | 28e12b8a-aab8-40a8-ae39-9a5a5f654d66 | 2024-08-20 21:12:55.305 -0700 | +-------------------------------+--------------------------------------+-------------------------------+ 
- d1_snapshots2024-08-19 17:12:28 に作成されたスナップショットを、- snapshot_idを使用して削除します:- ALTER SNAPSHOT SET d1_snapshots DELETE SNAPSHOT IDENTIFIER 'd3a77432-c98d-4969-91a9-fffae5dd655c'; 
- 2024-08-19 21:12:55 に作成された、より新しい - d1_snapshotsスナップショットの削除を試みてください。Snowflakeが、スナップショットセット内の最も古いスナップショット以外のスナップショットを削除できないようにする方法に注意してください。- ALTER SNAPSHOT SET d1_snapshots DELETE SNAPSHOT IDENTIFIER '28e12b8a-aab8-40a8-ae39-9a5a5f654d66'; - Snapshot '28e12b8a-aab8-40a8-ae39-9a5a5f654d66' cannot be deleted as it is not the oldest active snapshot in the snapshot set D1_SNAPSHOTS.
スナップショットセットの削除¶
DROP SNAPSHOT SET コマンドを使用して、スナップショットセットを削除できます。
注釈
保持ロックがあり、期限切れのスナップショットが含まれているスナップショットセットは削除できません。また、スナップショットのいずれかに法的保持がある場合は、スナップショットセットを削除することはできません。
t1_snapshots スナップショットセットを削除します:
DROP SNAPSHOT SET t1_snapshots;
s1_snapshots スナップショットセットを削除します:
DROP SNAPSHOT SET s1_snapshots;
d1_snapshots スナップショットセットを削除します:
DROP SNAPSHOT SET d1_snapshots;
特定のテーブルのバックアップを含むすべてのスナップショットセットを検索します¶
次の例は、特定のスキーマとデータベース内の特定のテーブルを含むすべてのスナップショットセットを検索する方法を示しています。その SHOWTABLES コマンドは、パイプ演算子を使用して、データベース、スキーマ、テーブルの名前を取得し、変数に保存します。その SHOWSNAPSHOTSETS 出力はフィルターされ、テーブルを含むデータベース、またはテーブルを含むスキーマ、またはその単一のテーブルを含むスナップショットセットを表示します。
SHOWSNAPSHOTSETS からのフィルター済み出力を見ると、データベースに2つのデータベース MY_BIG_IMPORTANT_DATABASE スナップショットセットがあり、 スキーマ MY_BIG_IMPORTANT_DATABASE には、1つのスキーマスナップショットがあり、PUBLICおよび MY_BIG_IMPORTANT_DATABASEテーブルに設定された1つのテーブルスナップショット PUBLIC、MY_SMALL_SECONDARY_TABLEがあります。
SHOW TABLES IN SCHEMA public ->>
  SET (dname, sname, tname) =
    (SELECT "database_name", "schema_name", "name" FROM $1
      WHERE "name" = 'MY_SMALL_SECONDARY_TABLE' AND "kind" = 'TABLE');
SHOW SNAPSHOT SETS ->> SELECT "object_kind", "name", "database_name", "schema_name", "object_name" FROM $1
  WHERE ("object_kind" = 'TABLE' AND "database_name" = $dname AND "schema_name" = $sname AND "object_name" = $tname)
    OR ("object_kind" = 'SCHEMA' AND "database_name" = $dname AND "object_name" = $sname)
    OR ("object_kind" = 'DATABASE' AND "object_name" = $dname);
+-------------+------------------+---------------------------+-------------+---------------------------+
| object_kind | name             | database_name             | schema_name | object_name               |
|-------------+------------------+---------------------------+-------------+---------------------------|
| DATABASE    | DATABASE_BACKUP  | MY_BIG_IMPORTANT_DATABASE | PUBLIC      | MY_BIG_IMPORTANT_DATABASE |
| DATABASE    | DATABASE_BACKUP2 | MY_BIG_IMPORTANT_DATABASE | PUBLIC      | MY_BIG_IMPORTANT_DATABASE |
| SCHEMA      | SCHEMA_BACKUP3   | MY_BIG_IMPORTANT_DATABASE | PUBLIC      | PUBLIC                    |
| TABLE       | TABLE_BACKUP2    | MY_BIG_IMPORTANT_DATABASE | PUBLIC      | MY_SMALL_SECONDARY_TABLE  |
+-------------+------------------+---------------------------+-------------+---------------------------+
依存関係のあるテーブルのスナップショットを作成する¶
以下の例では、別のスキーマのシーケンスと外部キーを参照するテーブルのテーブルスナップショットを作成する方法を示します。準備のために、シーケンスとテーブルを含むスキーマ other_schema を作成します。次に、シーケンスと他のテーブルを参照し、 public スキーマにメインテーブルを作成します。
USE DATABASE my_big_important_database;
CREATE SCHEMA other_schema;
USE SCHEMA other_schema;
CREATE SEQUENCE my_sequence;
CREATE TABLE my_dimension_table (id INT AUTOINCREMENT PRIMARY KEY);
USE SCHEMA public;
CREATE TABLE dependent_table
(
   id INT DEFAULT my_big_important_database.other_schema.my_sequence.NEXTVAL PRIMARY KEY,
   foreign_id INT,
   FOREIGN KEY (foreign_id) REFERENCES my_big_important_database.other_schema.my_dimension_table(id)
 );
SELECT GET_DDL('TABLE','dependent_table');
その GET_DDL()出力は、他のスキーマをポイントする参照を示しますː
+-------------------------------------------+
| GET_DDL('TABLE','DEPENDENT_TABLE')        |
|-------------------------------------------|
| create or replace TABLE DEPENDENT_TABLE ( |
|     ID NUMBER(38,0) NOT NULL DEFAULT MY_BIG_IMPORTANT_DATABASE.OTHER_SCHEMA.MY_SEQUENCE.NEXTVAL,
|     FOREIGN_ID NUMBER(38,0),                |
|     primary key (ID),                       |
|     foreign key (FOREIGN_ID) references MY_BIG_IMPORTANT_DATABASE.OTHER_SCHEMA.MY_DIMENSION_TABLE(ID)
| );                                        |
+-------------------------------------------+
次に、テーブルのスナップショットセットを作成し、スナップショットを追加します。
CREATE SNAPSHOT SET dependency_experiments FOR TABLE dependent_table;
ALTER SNAPSHOT SET dependency_experiments ADD SNAPSHOT;
SHOW SNAPSHOTS IN SNAPSHOT SET dependency_experiments;
その SHOWSNAPSHOTS 出力には、復元する操作に使用する snapshot_id 値が含まれます。
+-------------------------------+--------------------------------------+------------------------+---------------------------+--------------+-----------+
| created_on                    | snapshot_id                          | snapshot_set_name      | database_name             | schema_name  | expire_on |
|-------------------------------+--------------------------------------+------------------------+---------------------------+--------------+-----------|
| 2025-07-01 11:53:27.860 -0700 | 0fd44138-b571-449b-be0a-72779501f80e | DEPENDENCY_EXPERIMENTS | MY_BIG_IMPORTANT_DATABASE | OTHER_SCHEMA | NULL      |
+-------------------------------+--------------------------------------+------------------------+---------------------------+--------------+-----------+
そのテーブルを新しい名前で復元し、復元されたテーブルが他のスキーマのオブジェクトを参照していることを確認します。
CREATE TABLE restored_dependent_table FROM SNAPSHOT SET dependency_experiments
  IDENTIFIER '0fd44138-b571-449b-be0a-72779501f80e';
SELECT GET_DDL('TABLE','restored_dependent_table');
+----------------------------------------------------+
| GET_DDL('TABLE','RESTORED_DEPENDENT_TABLE')        |
|----------------------------------------------------|
| create or replace TABLE RESTORED_DEPENDENT_TABLE ( |
|     ID NUMBER(38,0) NOT NULL DEFAULT MY_BIG_IMPORTANT_DATABASE.OTHER_SCHEMA.MY_SEQUENCE.NEXTVAL,
|     FOREIGN_ID NUMBER(38,0),                         |
|     foreign key (FOREIGN_ID) references MY_BIG_IMPORTANT_DATABASE.OTHER_SCHEMA.MY_DIMENSION_TABLE(ID),
|     primary key (ID)                                 |
| );                                                 |
+----------------------------------------------------+
参照されるオブジェクトが存在しなくなった場合に何が起こるかを説明するために、シーケンスをドロップし、同じスナップショットからテーブルを再度復元します。
DROP SEQUENCE my_big_important_database.other_schema.my_sequence;
CREATE TABLE OR REPLACE restored_dependent_table FROM SNAPSHOT SET dependency_experiments
  IDENTIFIER '0fd44138-b571-449b-be0a-72779501f80e';
SELECT * FROM restored_dependent_table;
テーブルのクエリは引き続き機能します。
+----+------------+
| ID | FOREIGN_ID |
|----+------------|
+----+------------+
0 Row(s) produced. Time Elapsed: 0.129s
ただし、存在しなくなったシーケンスに依存するため、GET_DDL()、 DESCRIBEおよび INSERT などの操作はすべて失敗します:
SELECT GET_DDL('TABLE','restored_dependent_table');
002073 (02000): SQL compilation error:
Sequence used as a default value in table 'MY_BIG_IMPORTANT_DATABASE.OTHER_SCHEMA.RESTORED_DEPENDENT_TABLE'
  column 'ID' was not found or could not be accessed.
DESC TABLE restored_dependent_table;
+------------+--------------+--------+-------+----------------------------------------+-------------+------------+-------+------------+---------+-------------+----------------+
| name       | type         | kind   | null? | default                                | primary key | unique key | check | expression | comment | policy name | privacy domain |
|------------+--------------+--------+-------+----------------------------------------+-------------+------------+-------+------------+---------+-------------+----------------|
| ID         | NUMBER(38,0) | COLUMN | N     | [sequence cannot be found or accessed] | Y           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| FOREIGN_ID | NUMBER(38,0) | COLUMN | Y     | NULL                                   | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
+------------+--------------+--------+-------+----------------------------------------+-------------+------------+-------+------------+---------+-------------+----------------+
INSERT INTO restored_dependent_table (foreign_id) VALUES (2);
002073 (02000): SQL compilation error:
Sequence used as a default value in table 'MY_BIG_IMPORTANT_DATABASE.OTHER_SCHEMA.RESTORED_DEPENDENT_TABLE'
  column 'ID' was not found or could not be accessed.
動的テーブルのスナップショットを作成する¶
動的テーブルには常に他のテーブルへの参照があります。そのため、動的テーブルにはスキーマスナップショットまたはデータベーススナップショットを使用して、元のテーブルと動的テーブルを同じスナップショットに含めることができます。
動的テーブルのテーブルスナップショットを作成する場合は、DYNAMIC キーワードを CREATESNAPSHOTSET コマンドに含め、スナップショットから復元するときには CREATETABLE にも含めます。次の例では、動的テーブルと、そのテーブルのテーブルスナップショットセットを設定し、最初のスナップショットを作成します。
CREATE DYNAMIC TABLE my_dynamic_table
  TARGET_LAG = '1 minute'
  WAREHOUSE = my_wh
  AS SELECT * FROM my_base_table WHERE col1 IS NOT NULL;
CREATE SNAPSHOT SET dynamic_table_snapshots
  FOR DYNAMIC TABLE my_dynamic_table;
ALTER SNAPSHOT SET dynamic_table_snapshots ADD SNAPSHOT;
次の例は、さまざまな時間に作成されたスナップショットについて、スナップショット IDs を決定する方法を示しています。この場合、最新のスナップショットは結果セットの最初の行になります。次にCREATEDYNAMICTABLE コマンド内のスナップショット ID を使用します。
SHOW SNAPSHOTS IN SNAPSHOT SET dynamic_table_snapshots
  ->> SELECT "created_on", "snapshot_id" FROM $1
        ORDER BY "created_on" DESC;
CREATE DYNAMIC TABLE restored_dynamic_table
  FROM SNAPSHOT SET dynamic_table_snapshots
    IDENTIFIER '<snapshot_id_from_SHOW_SNAPSHOTS_output>';
Tip
スナップショットから動的テーブルを復元すると、Snowflake :ref:` は最初のリフレッシュ時に新しいテーブル <label-dynamic_tables_initialization>` を自動的に初期化します。
法的保持を追加および削除する¶
Snowflakeスナップショットの法的保持を扱う前に、その目的と要件について学びます。詳細については、 法的保持 をご参照ください。
組織の法律上またはコンプライアンスチームが、どのようなデータを保持する必要があるかを指定する請求、このデータを使用してデータを提供するとします。その場合は、次のようなプロセスに従うことができますː
- 法的チームと協力して、関連するデータが格納されている場所、および関連オブジェクトが含まれているスナップショットセットを特定します。 
- スナップショットセット内の該当する時間枠から、スナップショットに法的保持を使います。そうすると、そのスナップショットの自動有効期限が無効になります。スケジュールに基づいてSnowflakeが自動的に作成したスナップショット、または手動で作成したスナップショットに法的保持を置くことができます。法的保持は、スナップショットセットに関連するスナップショットポリシー、有効期限、または保持ロックがあるかどうかに関係なく適用されます。 
- スナップショットセットを含んでいるデータベースが複製されているセカンダリアカウントのリフレッシュ操作を実行します。そうすることで、法的保持と関連するスナップショットは、フェールオーバーとフェールバックの操作すべてで保持されます。 
- Snowflakeのアクセス制御とログを使用して、法的保持にあるデータへのアクセスを監査します。 
- 法的ケースが終了し、法的チームが法的保持を削除することを承認すると、APPLYLEGALHOLD 権限を持つユーザーは法的保持をリリースします。その後、期限切れの通常の自動化が再開されます。 
この例は、特定のスナップショットセット内のスナップショットに対する法的保持のライフサイクル中に使用する可能性のある SQL コマンドのシーケンスを示しています。関連するスナップショットの識別子は、 SHOWSNAPSHOTSINSNAPSHOTSET コマンドをしようして、"is_under_legal_hold" 列をチェックすることでで、法的保持がすでに開始されているかどうかを確認します。その後、特定のスナップショットから法的保持を追加または削除します。
USE ROLE <role_name>; -- use a role that has the APPLY LEGAL HOLD privilege
SHOW SNAPSHOTS IN SNAPSHOT SET <snapshot_set_name>
  ->> SELECT * FROM $1 WHERE "is_under_legal_hold" = 'N';
ALTER SNAPSHOT SET <snapshot_set_name>
  MODIFY SNAPSHOT IDENTIFIER '<snapshot_identifier>'
  ADD LEGAL HOLD;
USE ROLE <role_name>; -- use a role that has the APPLY LEGAL HOLD privilege
SHOW SNAPSHOTS IN SNAPSHOT SET <snapshot_set_name>
  ->> SELECT * FROM $1 WHERE "is_under_legal_hold" = 'Y';
ALTER SNAPSHOT SET <snapshot_set_name>
  MODIFY SNAPSHOT IDENTIFIER '<snapshot_identifier>'
  REMOVE LEGAL HOLD;
Tip
また、 "is_under_legal_hold" 列を INFORMATION_SCHEMA.SNAPSHOTS または ACCOUNT_USAGE.SNAPSHOTS ビューでクエリすることで、法的保持が存在するかどうかを確認することもできます。
スナップショットおよびスナップショット操作のモニター¶
次のビューをクエリすると、どのスナップショット関連オブジェクトが存在するか、それらのプロパティ、およびどれだけのストレージを使用するかを確認できます。
情報スキーマ:
アカウント使用状況:
SQL 参照トピック¶
スナップショットポリシー¶
スナップショットセット¶
スナップショット¶
実際の CREATESNAPSHOT コマンドを実行するわけではありません。新しいスナップショットを作成するには、ALTERSNAPSHOTSET... ADDSNAPSHOT を実行します。または、スナップショットセットをスケジュールのあるスナップショットポリシーに関連付けると、Snowflakeは指定されたスケジュールに基づいて、スナップショットセットにスナップショットを自動的に作成します。古いスナップショットを削除するには、ALTERSNAPSHOTSET... DELETESNAPSHOT を実行します。このような操作では、特定のスナップショットの識別子を指定する必要があります。次のコマンドを使用して、スナップショットの識別子と、各スナップショットの作成日などの他の情報を見つけることができます。
スナップショットからのオブジェクトの復元¶
CREATE:samp:`{object_kind}`FROMSNAPSHOTSET 構文を使用して、適切な種類のスナップショットセットから各種類のオブジェクトを復元する。
スナップショットセット内のそれ以降のスナップショットは、復元されたオブジェクトではなく、元のオブジェクトを使用します。これは、復元されたオブジェクトの名前を元のオブジェクトと同じ名前に変更した場合でも当てはまります。復元する後も同じスナップショットセットを引き続き使用する場合は、オブジェクトを新しい名前で復元するから、データを元のオブジェクトに転送します。
ビュー¶
以下のシステムビューには、スナップショット、スナップショットセット、スナップショットポリシーに関連するメタデータが含まれています。
情報スキーマビュー¶
INFORMATION_SCHEMA スキーマ内のこれらのビューには、現在存在するスナップショット関連のオブジェクトに関する情報が含まれています:
アカウント使用状況ビュー:¶
ACCOUNT_USAGE スキーマに内のビューには、現在存在する、または削除されたスナップショット関連のオブジェクト、スナップショットで実行された操作、およびそれらが使用するストレージに関する情報が含まれています。