CREATE OR ALTER <オブジェクト>

CREATE OR ALTER コマンドは、 ALTER <オブジェクト> コマンドの制限付きの CREATE <オブジェクト> コマンドでサポートされている構文を使用して、オブジェクトを定義できるようにすることで、 CREATE コマンドと ALTER コマンドの機能を組み合わせた DDL コマンドです。

コマンドは、データおよび関連付けを維持します。つまり、データとその他の状態、タグの関連付けとアタッチされたポリシー、オブジェクトの権限付与が維持されます。しかし、オブジェクトの変換によってはデータが欠落することがあります。たとえば、 CREATE OR ALTER TABLE ステートメントの結果、列がドロップされた場合、列に含まれるデータはすべて削除されます。

CREATE OR ALTER コマンドを使用すると、宣言的なべき等メソッドを使用してオブジェクトに増分更新を適用できます。CREATE OR ALTER ステートメントを実行すると、次のいずれかの結果が得られます。

  • オブジェクトが存在しない場合は、定義に従って作成されます。

  • オブジェクトが存在する場合は、ステートメントで定義されたオブジェクトに変更されます。

  • オブジェクトがすでに定義にマッチしている場合、そのオブジェクトは変更されません。

コマンドは、オブジェクトのデータ、状態、タグの関連付け、アタッチされたポリシー、権限付与を保持します。しかし、一部の変換ではデータが欠落することがあります。たとえば、 CREATE OR ALTER TABLE ステートメントが列をドロップした場合、その列のデータは失われますが、Time Travelで回復することができます。

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

CREATE <オブジェクト>ALTER <オブジェクト>

構文

CREATE OR ALTER <object_type> <object_name>
  [ <object_type_properties> ]
  [ <object_type_params> ]
  [ COMMENT = '<string_literal>' ]
Copy

object_type_properties および object_type_params はオブジェクト型に固有です。

特定の構文、使用上の注意、および例については、以下をご参照ください。

アカウントオブジェクト:

データベースオブジェクト:

一般的な使用上の注意

  • データガバナンス: CREATE OR ALTER コマンドは、データガバナンスの変更をサポートしていません。既存のタグやポリシーは、 CREATE OR ALTER ステートメントの影響を受けず、変更されません。

  • オブジェクトプロパティとパラメーターの設定解除: 以前に設定されたプロパティやパラメーターが変更後のオブジェクト定義に存在しない場合、その設定は解除されます。

    明示的な パラメーター 値の設定を解除すると、パラメーターはデフォルト値にリセットされます。パラメーターがターゲットオブジェクトを含むオブジェクトに設定された場合、ターゲットオブジェクトは、そのオブジェクトを含むオブジェクトに設定された値を継承します。それ以外の場合、オブジェクトのパラメーター値はデフォルト値にリセットされます。

  • アトミック性: 現在、 CREATE OR ALTER TABLE コマンドはアトミック性を保証しません。これは、 CREATE OR ALTER TABLE ステートメントが実行中に失敗した場合、変更のサブセットがテーブルに適用された可能性があることを意味します。部分的な変更の可能性がある場合の多くで、エラーメッセージには以下のテキストが含まれます。

    CREATE OR ALTER execution failed. Partial updates may have been applied.
    

    たとえば、 A 列をドロップし、 B 列を新たにテーブルに追加しようとしていてステートメントが中止された場合、 A 列はドロップされたが、 B 列は追加されなかった可能性があります。

    注釈

    変更が部分的に適用されても、結果的にテーブルはまだ有効な状態にあり、 ALTER TABLE ステートメントを追加して、元の変更セットを完了させることができます。

    部分更新から復元するために、Snowflakeは以下の復元メカニズムを推奨しています。

    • 前方修正

      • CREATE OR ALTER TABLE ステートメントを再実行します。2回目の試行でステートメントが成功すれば、ターゲット状態が達成されます。

      • エラーメッセージを調査します。可能であれば、エラーを修正し、 CREATE OR ALTER TABLE ステートメントを再実行します。

    • ロールバック

      前方修正が不可能な場合は、部分的な変更を手動でロールバックすることをSnowflakeはお勧めします。

      • DESCRIBE TABLESHOW TABLES コマンドを使用してテーブルの状態を調査します。どの部分的な変更(ある場合)が適用されたかを判断します。

      • 部分的な変更が適用された場合は、適切な ALTER TABLE ステートメントを実行し、テーブルを元の状態に戻します。

        注釈

        場合によっては、部分的な変更を元に戻せないことがあります。詳細については、 ALTER TABLE ... ALTER COLUMN トピックにある、列プロパティの変更でサポートされるアクションとサポートされないアクションをご参照ください。

    • 部分的な更新からの復元にヘルプが必要な場合は、 Snowflakeサポート にお問い合わせください。

制限事項

CREATE OR ALTER <オブジェクト> コマンドの具体的な制限事項はオブジェクトによって異なります。制限の例としては、以下のようなものがあります。

  • CREATE OR ALTER TABLE コマンドは検索最適化をサポートしていません。検索最適化は CREATE TABLE 構文の一部ではないからです。

  • テーブルの列のデータ型を互換性のないデータ型に変更することはできません。

  • 既存のビューの定義を変更することはできません。

  • タスクを変更する前に、タスクを中断する必要があります。

  • オブジェクトを作成するためのバリアント構文(例: CREATE OR ALTER TABLE ... AS SELECT)は現在サポートされていません。

特定のオブジェクトの制限については、 オブジェクトの参照トピック をご参照ください。

ユースケース例

アプリケーションにSnowflakeオブジェクトを設定する SQL スクリプトがある場合は、 CREATE OR ALTER <オブジェクト> ステートメントをスクリプトで使用すると、開発環境、テスト環境、実稼働環境で変更を簡単に展開することができます。アプリケーションが進化するにつれて、スクリプトに修正を加えることができます。

CREATE OR ALTER <オブジェクト> ステートメントを使用すると、新しい環境でスクリプトを実行しながら、既存の環境でスクリプトを再実行することができ、希望のオブジェクト定義を1回記述して、環境全体で適用できるようになります。