CREATE DYNAMIC TABLE¶
指定されたクエリに基づいて、 動的テーブル を作成します。
このコマンドは次のバリアントをサポートしています。
- CREATE OR ALTER DYNAMIC TABLE:動的テーブルが存在しない場合は動的テーブルを作成するか、既存の動的テーブルを変更します。 
- CREATE DYNAMIC TABLE FROM SNAPSHOT SET:バックアップから動的テーブルを復元します。 
- CREATE DYNAMIC TABLE ... CLONE:既存の動的テーブルのクローンを作成します。 
- CREATE DYNAMIC ICEBERG TABLE:動的 Apache Iceberg™ テーブルを作成します。 
- こちらもご参照ください。
- ALTER DYNAMIC TABLE, DESCRIBE DYNAMIC TABLE, DROP DYNAMIC TABLE , SHOW DYNAMIC TABLES, CREATE OR ALTER <オブジェクト> 
このトピックの内容:
構文¶
CREATE [ OR REPLACE ] [ TRANSIENT ] DYNAMIC TABLE [ IF NOT EXISTS ] <name> (
    -- Column definition
    <col_name> <col_type>
      [ [ WITH ] MASKING POLICY <policy_name> [ USING ( <col_name> , <cond_col1> , ... ) ] ]
      [ [ WITH ] PROJECTION POLICY <policy_name> ]
      [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
      [ WITH CONTACT ( <purpose> = <contact_name> [ , <purpose> = <contact_name> ... ] ) ]
      [ COMMENT '<string_literal>' ]
    -- Additional column definitions
    [ , <col_name> <col_type> [ ... ] ]
  )
  TARGET_LAG = { '<num> { seconds | minutes | hours | days }' | DOWNSTREAM }
  WAREHOUSE = <warehouse_name>
  [ REFRESH_MODE = { AUTO | FULL | INCREMENTAL } ]
  [ INITIALIZE = { ON_CREATE | ON_SCHEDULE } ]
  [ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
  [ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
  [ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
  [ COMMENT = '<string_literal>' ]
  [ COPY GRANTS ]
  [ [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
  [ [ WITH ] AGGREGATION POLICY <policy_name> [ ENTITY KEY ( <col_name> [ , <col_name> ... ] ) ] ]
  [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
  [ REQUIRE USER ]
  [ IMMUTABLE WHERE ( <expr> ) ]
  [ BACKFILL FROM ]
  AS <query>
バリアント構文¶
CREATE OR ALTER DYNAMIC TABLE¶
CREATE OR ALTER DYNAMIC TABLE <name> (
  -- Column definition
  <col_name> <col_type>
    [ COLLATE '<collation_specification>' ]
    [ COMMENT '<string_literal>' ]
  -- Additional column definitions
  [ , <col_name> <col_type> [ ... ] ]
  )
  TARGET_LAG = { '<num> { seconds | minutes | hours | days }' | DOWNSTREAM }
  WAREHOUSE = <warehouse_name>
  [ REFRESH_MODE = FULL | INCREMENTAL | AUTO ]
  [ IMMUTABLE WHERE ( <expr> ) ]
  [ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
  [ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
  [ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
  [ COMMENT = '<string_literal>' ]
動的テーブルが存在しない場合は作成するか、動的テーブル定義に従ってテーブルを変更します。CREATE OR ALTER DYNAMIC TABLE 構文は CREATE DYNAMIC TABLE ステートメントのルールに従い、この構文には ALTER DYNAMIC TABLE ステートメントと同じ制限があります。
詳細については、 CREATE OR ALTER <オブジェクト> をご参照ください。
次の動的テーブルのプロパティとパラメーターの変更は、データを保持します。
- TARGET_LAG 
- WAREHOUSE 
- CLUSTER に BY 
- DATA_RETENTION_TIME_IN_DAYS 
- MAX_DATA_EXTENSION_TIME_IN_DAYS 
- COMMENT 
- IMMUTABLE に WHERE - 指定すると、可変リージョンのみが再初期化され、不変リージョンのデータは保持されます。詳細については、 不変性制約を持つ動的テーブルを作成する をご参照ください。 
 
以下の動的テーブルプロパティとパラメーターの変更により、再初期化 がトリガーされます。
- REFRESH_MODE 
- クエリまたは列リストへの変更。 - 既存の列のドロップはサポートされています。 
- 新しい列の追加はサポートされていますが、既存の列の最後にのみ追加できます。 
- IMMUTABLEWHERE 述語内で使用される列のドロップ、またはクラスタリングキーとして使用される列のドロップはサポートされていません。 
 
詳細については、 CREATE OR ALTER TABLE の使用上の注意 をご参照ください。
CREATE DYNAMIC TABLE FROM SNAPSHOT SET¶
CREATE DYNAMIC TABLE <name> FROM SNAPSHOT SET <snapshot_set> IDENTIFIER '<snapshot_id>'
その FROMSNAPSHOTSET 句は、バックアップから動的データベースを復元します。他のテーブルプロパティは、バックアップテーブルにあるものとすべて同じであるため、指定しません。
このフォームには CREATEORREPLACE 句がありません。通常は、新しい名前で動的テーブルを復元して、この新しいテーブルからデータまたはその他のオブジェクトを回復させるか、元のテーブルの名前を変更してから、元の名前でテーブルを復元します。
注釈
スナップショットセットは、元のテーブルの内部テーブル ID に関連付けられています。スナップショットセットに追加するスナップショットは、名前を変更しても、元のテーブルを使用します。新しく復元されたテーブルのバックアップを作成する場合は、そのテーブル用に新しいスナップショットセットを作成します。
スナップショットから動的テーブルを復元すると、Snowflakeは最初の更新時に新しいテーブルを 自動的に初期化します。
スナップショットの詳細については、バックアップと不変ストレージのスナップショット をご参照ください。
- snapshot_set
- 特定の動的テーブル用に作成されたスナップショットセットの名前を指定します。SHOWSNAPSHOTSETS コマンドを使用して、適切なスナップショットセットを見つけることができます。 
- snapshot_id
- そのスナップショットセット内の特定のスナップショットの識別子を指定します。SHOWSNAPSHOTSINSNAPSHOTSET コマンドを使用して、スナップショットの作成日時に基づいて、スナップショットセット内で適切な識別子を見つけます。 
CREATE DYNAMIC TABLE ... CLONE¶
データを実際にコピーすることなく、同じ列定義を使用して、ソースの動的テーブルのすべての既存データを含む新しい動的テーブルを作成します。クローンされた動的テーブルはソースのスケジュール状態を継承します。
また、過去の特定の時点に存在した動的テーブルをクローンすることもできます。詳細については、 クローニングに関する考慮事項 をご参照ください。
CREATE [ OR REPLACE ] [ TRANSIENT ] DYNAMIC TABLE <name>
  CLONE <source_dynamic_table>
        [ { AT | BEFORE } ( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> } ) ]
  [
    COPY GRANTS
    TARGET_LAG = { '<num> { seconds | minutes | hours | days }' | DOWNSTREAM }
    WAREHOUSE = <warehouse_name>
  ]
ソースの動的テーブルにクラスタリングキーがある場合は、クローンされた動的テーブルにもクラスタリングキーがあります。デフォルトでは、ソーステーブルに対して自動クラスタリングが中断されていなくても、新しいテーブルに対しては自動クラスタリングが中断されます。
クローンの詳細については、 CREATE <オブジェクト> ... CLONE をご参照ください。
CREATE DYNAMIC ICEBERG TABLE¶
新しい動的 Apache Iceberg™ テーブルを作成します。Icebergテーブルについては、 Apache Iceberg™ テーブル および CREATE ICEBERG TABLE (IcebergカタログとしてのSnowflake) をご参照ください。
CREATE [ OR REPLACE ] DYNAMIC ICEBERG TABLE <name> (
  -- Column definition
  <col_name> <col_type>
    [ [ WITH ] MASKING POLICY <policy_name> [ USING ( <col_name> , <cond_col1> , ... ) ] ]
    [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
    [ COMMENT '<string_literal>' ]
  -- Additional column definitions
  [ , <col_name> <col_type> [ ... ] ]
)
TARGET_LAG = { '<num> { seconds | minutes | hours | days }' | DOWNSTREAM }
WAREHOUSE = <warehouse_name>
[ EXTERNAL_VOLUME = '<external_volume_name>' ]
[ CATALOG = 'SNOWFLAKE' ]
[ BASE_LOCATION = '<optional_directory_for_table_files>' ]
[ REFRESH_MODE = { AUTO | FULL | INCREMENTAL } ]
[ INITIALIZE = { ON_CREATE | ON_SCHEDULE } ]
[ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
[ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
[ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
[ COMMENT = '<string_literal>' ]
[ COPY GRANTS ]
[ [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
[ REQUIRE USER ]
AS <query>
使用方法と制限の詳細については、 動的 Apache Iceberg™ テーブルを作成する をご参照ください。
必須パラメーター¶
- name
- 動的テーブルの識別子(つまり、名前)を指定します。動的テーブルが作成されるスキーマに対して一意である必要があります。 - また、識別子はアルファベット文字で始まる必要があり、識別子文字列全体が二重引用符で囲まれている場合を除き、スペースや特殊文字を含めることはできません(例: - "My object")。二重引用符で囲まれた識別子も大文字と小文字が区別されます。- 詳細については、 識別子の要件 をご参照ください。 
- TARGET_LAG = { num { seconds | minutes | hours | days } | DOWNSTREAM }
- 動的テーブルのラグを指定します。 - 'num seconds | minutes | hours | days'
- 動的テーブルのコンテンツがベーステーブルの更新から遅れる最大時間を指定します。 - 例: - 動的テーブルのデータが5分以上遅れないようにするには、 - 5 minutesを指定します。
- 動的テーブルのデータが5時間以上遅れないようにするには、 - 5 hoursを指定します。
 - 60秒以上でなければなりません。動的テーブルが他の動的テーブルに依存する場合、最小ターゲット・ラグは依存する動的テーブルのターゲット・ラグ以上である必要があります。 
- DOWNSTREAM
- 動的テーブルが依存する動的テーブルのリフレッシュ時にのみ、動的テーブルをリフレッシュするように指定します。 
 
- WAREHOUSE = warehouse_name
- 動的テーブルをリフレッシュするためのコンピューティングリソースを提供するウェアハウスの名前を指定します。 - 動的テーブルを作成するには、ロールがこのウェアハウスに対する USAGE 権限を持つことが必要です。制限と詳細情報については、 動的テーブルを作成する権限 をご参照ください。 
- AS query
- 動的テーブルの結果を含むクエリを指定します。 
オプションのパラメーター¶
- TRANSIENT
- テーブルが一時的であることを指定します。 - 永続的な動的テーブルと同様に、 一時的な 動的テーブルも明示的にドロップされるまで存在し、適切な権限を持つユーザーであれば誰でも利用できます。一時的な動的テーブルはフェールセーフストレージにデータを保持しないため、特に頻繁にリフレッシュされるテーブルのストレージコストを削減できます。このように耐久性が低下しているため、一時的な動的テーブルは、永続的なテーブルが提供するようなレベルのデータ保護やリカバリを必要としない一時的なデータに使用するのが最適です。 - デフォルト:値なし。動的テーブルが - TRANSIENTとして宣言されていない場合は永続的です。
- REFRESH_MODE = { AUTO | FULL | INCREMENTAL }
- 動的テーブルの リフレッシュモード を指定します。 - このプロパティは、動的テーブルの作成後に変更することはできません。プロパティを変更するには、動的テーブルを CREATE OR REPLACE DYNAMIC TABLE コマンドで置き換えます。 - AUTO
- リフレッシュ・モードが - AUTOの場合、システムはデフォルトでインクリメンタルリフレッシュを適用しようとします。しかし、インクリメンタルリフレッシュがサポートされていなかったり、パフォーマンスが期待できない場合、動的テーブルは自動的にフルリフレッシュを選択します。詳細については、 動的テーブルのリフレッシュモード および 動的なテーブル更新モードを選択するためのベストプラクティス をご参照ください。- リフレッシュモードと自動推奨を試して、ユースケースに最適なモードを決定してください。Snowflakeのリリース間で一貫した動作を維持するには、すべての動的テーブルで明示的にリフレッシュモードを設定する必要があります。 - 動的テーブルのリフレッシュモードを確認するには、 動的テーブルリフレッシュモードを表示する をご参照ください。 
- FULL
- 動的テーブルが増分更新できる場合でも、動的テーブルのフル更新を強制します。 
- INCREMENTAL
- 動的テーブルの増分更新を強制します。動的テーブルの基となるクエリが増分更新を実行できない場合、動的テーブルの作成は失敗し、エラーメッセージが表示されます。 
 - デフォルト: - AUTO
- INITIALIZE
- 動的テーブルの 初期更新 の動作を指定します。このプロパティは、動的テーブルの作成後に変更することはできません。プロパティを変更するには、動的テーブルを CREATE OR REPLACE DYNAMIC TABLE コマンドで置き換えます。 - ON_CREATE
- 作成時に動的テーブルを同時に更新します。このリフレッシュに失敗すると、動的テーブルの作成に失敗し、エラーメッセージが表示されます。 
- ON_SCHEDULE
- 次回更新時に動的テーブルを更新します。 - 更新スケジュールプロセスが実行される際に、動的テーブルにデータが入力されます。動的テーブルの作成時にはデータは入力されません。 - SELECT * FROM DYNAMIC TABLEを使用してテーブルをクエリしようとすると、最初のスケジュールされた更新がまだ発生していないため、以下のエラーが表示される可能性があります。- Dynamic Table is not initialized. Please run a manual refresh or wait for a scheduled refresh before querying.
 - デフォルト: - ON_CREATE
- COMMENT 'string_literal'
- 列のコメントを指定します。 - (コメントは列レベルまたはテーブルレベルで指定できることに注意してください。それぞれの構文は少し異なります。) 
- MASKING POLICY = policy_name
- 列に設定する マスキングポリシー を指定します。 
- PROJECTION POLICY policy_name
- 列に設定する 投影ポリシー を指定します。 
- column_list
- 列の名前を変更したり、動的テーブルの列にコメントを追加する場合は、列名と(必要に応じて)列に関するコメントを指定する列リストを含めます。列のデータ型を指定する必要はありません。 - 動的テーブルの列のいずれかが式(例えば、単純な列名だけでない列)に基づいている場合、動的テーブルの各列に列名を指定する必要があります。例えば、次の場合には列名が必要です。 - CREATE DYNAMIC TABLE my_dynamic_table (pre_tax_profit, taxes, after_tax_profit) TARGET_LAG = '20 minutes' WAREHOUSE = mywh AS SELECT revenue - cost, (revenue - cost) * tax_rate, (revenue - cost) * (1.0 - tax_rate) FROM staging_table; - 列ごとにオプションのコメントを指定できます。例: - CREATE DYNAMIC TABLE my_dynamic_table (pre_tax_profit COMMENT 'revenue minus cost', taxes COMMENT 'assumes taxes are a fixed percentage of profit', after_tax_profit) TARGET_LAG = '20 minutes' WAREHOUSE = mywh AS SELECT revenue - cost, (revenue - cost) * tax_rate, (revenue - cost) * (1.0 - tax_rate) FROM staging_table; 
- WITH CONTACT ( purpose = contact [ , purpose = contact ...] )
- 新しいオブジェクトを1つ以上の 連絡先 に関連付けます。 
- CLUSTER BY ( expr [ , expr , ... ] )
- 動的テーブル内の1つ以上の列または列式をクラスタリングキーとして指定します。動的テーブルのクラスタリングキーを指定する前に、マイクロパーティションについて理解する必要があります。詳細については、 Snowflakeテーブル構造について をご参照ください。 - クラスタリングキーを動的テーブルで使用する場合は、以下の点に注意してください。 - 列定義は必須であり、ステートメントで明示的に指定する必要があります。 
- デフォルトでは、ソーステーブルに対して自動クラスタリングが中断されていても、新しい動的テーブルに対しては自動クラスタリングが中断されません。 
- クラスタリングキーは、すべてのテーブルに対して意図または推奨されているわけでは ありません。通常、非常に大きな(例: マルチテラバイト)テーブルに役立ちます。 
- CLUSTER BY を指定しても、データは作成時にクラスター化されません。代わりに、 CLUSTER BY は自動クラスタリングに依存して、時間の経過とともにデータを再クラスタリングします。 
 - 詳細については、 クラスタリングキーとクラスタ化されたテーブル をご参照ください。 - デフォルト:値なし(テーブルにクラスタリングキーが定義されていない) 
- DATA_RETENTION_TIME_IN_DAYS = integer
- 動的テーブルの履歴データに対してTime Travelアクション(SELECT、CLONE、)を実行できるように、動的テーブルの保持期間を指定します。Time Travel動的テーブルでも従来のテーブルと同じように動作します。詳細については、 Time Travelの理解と使用 をご参照ください。 - このオブジェクトレベルパラメーターの詳細な説明、およびオブジェクトパラメーターの詳細については、 パラメーター をご参照ください。 - 値: - Standard Edition: - 0または- 1
- Enterprise Edition: - 永続テーブルの場合は - 0~- 90
- 仮および一時テーブルの場合は - 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 をご参照ください。 
- COMMENT = 'string_literal'
- 動的テーブルのコメントを指定します。 - (コメントは列レベルまたはテーブルレベルで指定できることに注意してください。それぞれの構文は少し異なります。) - デフォルト:値なし。 
- COPY GRANTS
- 次の CREATE DYNAMIC TABLE バリアントのいずれかを使用して新しい動的テーブルが作成されるときに、元のテーブルからのアクセス権限を保持することを指定します。 - CREATE OR REPLACE DYNAMIC TABLE 
- CREATE OR REPLACE DYNAMIC ICEBERG TABLE 
- CREATE OR REPLACE DYNAMIC TABLE ... CLONE 
 - このパラメーターは、既存の動的テーブルから新しい動的テーブルに、OWNERSHIP を :emph:` 除く ` すべての権限をコピーします。新しい動的テーブルは、スキーマ内のオブジェクトタイプに定義された将来の付与を継承 しません。デフォルトでは、 CREATE DYNAMIC TABLE ステートメントを実行するロールが新しい動的テーブルを所有します。 - このパラメーターが CREATE DYNAMIC TABLE ステートメントに含まれていない場合、新しい動的テーブルは元の動的テーブルに付与された明示的なアクセス権限を継承 しません が、スキーマ内のオブジェクトタイプに定義された将来の付与は継承します。 - ステートメントにより同じ名前の既存のテーブルを置き換える場合、権限は置き換えられるテーブルからコピーされます。その名前の既存のテーブルがない場合、権限はコピーされます。 - たとえば、次のステートメントは - dt0から複製された動的テーブル- dt1を作成し、- dt0からすべての権限をコピーします。コマンドを初めて実行したときに、- dt1は- dt0からすべての権限をコピーします。同じコマンドを再度実行すると、- dt1は- dt0ではなく- dt1からすべての権限をコピーします。- CREATE OR REPLACE DYNAMIC TABLE dt1 CLONE dt0 COPY GRANTS; - 次の点に注意してください。 - データ共有 の場合、 - 既存の動的テーブルが別のアカウントと共有されていた場合は、置換する動的テーブルも共有されます。 
- 既存の動的テーブルがデータコンシューマーとしてアカウントと共有され、アクセスがアカウント内の他のロールにさらに許可された場合(親データベースの - GRANT IMPORTED PRIVILEGESを使用)、置換する動的テーブルにもアクセスが許可されます。
 
- 置換する動的テーブルの SHOW GRANTS 出力には、コピーされた権限の被付与者が、ステートメントが実行されたときの現在のタイムスタンプとともに、 CREATE TABLE ステートメントを実行したロールとしてリストされます。 
- 置換する動的テーブルの SHOW GRANTS 出力には、コピーされた権限の被付与者が、ステートメントが実行されたときの現在のタイムスタンプとともに、 CREATE TABLE ステートメントを実行したロールとしてリストされます。 
- 許可をコピーする操作は、 CREATE DYNAMIC TABLE コマンドで(つまり、同じトランザクション内で)アトミックに発生します。 
 - 重要 - COPY GRANTS パラメーターは、 CREATE [ OR REPLACE ] DYNAMIC TABLE コマンドの中で、クエリ定義の後ろ以外のどこにでも置くことができます。 - たとえば、以下のダイナミックテーブルは作成に失敗します。 - CREATE OR REPLACE DYNAMIC TABLE my_dynamic_table TARGET_LAG = DOWNSTREAM WAREHOUSE = mywh AS SELECT * FROM staging_table COPY GRANTS; 
- ROW ACCESS POLICY policy_name ON ( col_name [ , col_name ... ] )
- 動的テーブルに設定する 行アクセスポリシー を指定します。 
- TAG ( tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] )
- タグ の名前とタグ文字列の値を指定します。 - タグ値は常に文字列であり、タグ値の最大文字数は256です。 - ステートメントでのタグの指定に関する情報については、 オブジェクトのタグクォータ をご参照ください。 
- AGGREGATION POLICY policy_name [ ENTITY KEY ( col_name [ , col_name ... ] ) ]
- 動的テーブルに設定する 集計ポリシー を指定します。テーブルに1つ以上の集計ポリシーを適用できます。 - オプションの ENTITY KEY パラメーターを使用して、動的テーブル内でエンティティを一意に識別する列を定義します。詳細については、 集計ポリシーによるエンティティレベルのプライバシーの実装 をご参照ください。集計ポリシーには、1つ以上のエンティティキーを指定できます。 
- REQUIRE USER
- 指定すると、ユーザーが指定されない限り、ダイナミックテーブルは実行できません。COPY SESSION パラメーターが指定された手動リフレッシュでユーザーが設定されない限り、ダイナミックテーブルはリフレッシュできません。 - このオプションを有効にすると、 - INITIALIZEの ON_SCHEDULE パラメーターでダイナミックテーブルを作成する必要があります。
- IMMUTABLE WHERE
- 動的テーブルの不変部分を定義する条件を指定します。詳細については、 不変性制約を持つ動的テーブルを作成する をご参照ください。 
- BACKFILL FROM <name>
- データをバックフィルするテーブルを指定します。 - アップストリームソースと異なる場合でも、バックフィルデータは変更されないようにする必要があるため、IMMUTABLEWHERE 不変性制約 によって定義されたデータのみをバックフィルできます。 - 詳細については、 バックフィルを使用して動的テーブルを作成する をご参照ください。 
アクセス制御の要件¶
この操作の実行に使用される ロール には、少なくとも次の 権限 が必要です。
| 権限 | オブジェクト | 注意 | 
|---|---|---|
| CREATE DYNAMIC TABLE | 動的テーブルの作成を予定のスキーマ。 | |
| SELECT | 新しい動的テーブルをクエリする予定のテーブル、ビュー、動的テーブル。 | |
| USAGE | テーブルのリフレッシュに使用する予定のウェアハウス。 | 
スキーマ内のオブジェクトに対して操作を実行するには、親データベースとスキーマに対する USAGE 権限が必要です。スキーマに対する任意の権限を付与されたロールは、そのロールがスキーマを解決できることに注意してください。たとえば、スキーマに対する CREATE 権限を付与されたロールは、そのスキーマにオブジェクトを作成できますが、そのスキーマに対する USAGE も 付与されている必要はありません。
指定された権限のセットを使用してカスタムロールを作成する手順については、 カスタムロールの作成 をご参照ください。
セキュリティ保護可能なオブジェクト に対して SQL アクションを実行するためのロールと権限付与に関する一般的な情報については、 アクセス制御の概要 をご参照ください。
使用上の注意¶
- CREATE DYNAMIC TABLE コマンドを実行すると、現在使用中のロールが動的テーブルの所有者になります。このロールは、動的テーブルのリフレッシュをバックグラウンドで実行するために使用されます。 
- 動的テーブルを作成した後にスキーマを変更することはできません。 
- 動的テーブルは、基になるデータベースオブジェクトが変更されると更新されます。変更追跡は、動的テーブルで使用される基になるオブジェクトすべてで有効にする必要があります。変更の追跡を有効にする をご参照ください。 
- 既存の動的テーブルを置き換えたい場合で、現在の定義を確認する必要がある場合は、 GET_DDL 関数を呼び出します。 
- 動的テーブルの定義で ORDER BY を使用すると、予期しない順序でソートされた結果が生成されることがあります。動的テーブルをクエリする際に ORDER BY を使用すると、選択した行が特定の順序で返されるようにすることができます。 
- Snowflakeは、 ORDER BY を使用して動的テーブルから選択するビューを作成することはサポートしていません。 
- 一部の式、句、および関数は現在、動的テーブルではサポートされていません。包括的なリストについては、 動的テーブルの制限 をご参照ください。 
- Snowflakeサービスを使用する場合、お客様は、個人データ(ユーザーオブジェクト向け以外)、機密データ、輸出管理データ、またはその他の規制されたデータがメタデータとして入力されていないことを確認する必要があります。詳細については、 Snowflakeのメタデータフィールド をご参照ください。 
- OR REPLACEと- IF NOT EXISTS句は互いに排他的です。両方を同じステートメントで使うことはできません。
- CREATE OR REPLACE <オブジェクト> ステートメントはアトミックです。つまり、オブジェクトが置き換えられると、単一のトランザクションで、古いオブジェクトが削除されて新しいオブジェクトが作成されます。 
CREATE OR ALTER DYNAMIC TABLE の使用上の注意¶
- ALTER DYNAMIC TABLE コマンドのすべての制限が適用されます。 
制限事項¶
次のアクションはサポートされていません。
SWAPWITH パラメーターを使用した動的テーブルの交換。
RENAMETO パラメーターを使用した動的テーブルの名前変更。
CLONE パラメーターを使用した動的テーブルのクローンの作成。
SUSPEND および RESUME パラメーターの使用による一時停止または再開。
TRANSIENT 動的テーブルを非 TRANSIENT 動的テーブルに変換、またはその逆。
タグやポリシーの追加や変更。既存のタグとポリシーは保持され、他のステートメントはタグとポリシーを追加または削除する可能性があります。
動的 Apache Iceberg™ テーブルの作成または変更。
最新の定義またはリフレッシュモード変更前の時間のTime Travelクローン。
さらに、動的テーブル作成後のREFRESH_MODE および INITIALIZE プロパティの値の変更はサポートされていません。AUTO リフレッシュモードと特定の INCREMENTAL および FULL リフレッシュモードを切り替えることはできますが、その場合は動的テーブルの実際の物理的なリフレッシュモードは変更されません。
例:
- AUTOリフレッシュモードで動的テーブルを作成した場合、システムはすぐに具体的なモード(- INCREMENTALまたは- FULL)を割り当てます。後続の CREATE OR ALTER DYNAMIC TABLE ステートメントで実行するときには- AUTOまたは作成時にエンジンによって選択される具体的なリフレッシュモードを指定できます。ただし、これは割り当てられたリフレッシュモードを変更しません。そのままです。
- 特定のリフレッシュモード( - INCREMENTALまたは- FULL)で動的テーブルを作成する場合、後からCREATE OR ALTER DYNAMIC TABLE ステートメント内の- AUTOを指定して、前方互換性を有効にできます。たとえば、動的テーブルが- FULLモードで作成され、バージョン管理されている場合、CREATE OR ALTER DYNAMIC TABLE ステートメント内の- AUTOを指定すると、- AUTOを使用するための新しいテーブルが有効になります。既存のテーブルは、互換性を損なわない- FULLモードに残っています。
暗黙的な更新はありません¶
CREATE OR ALTER DYNAMIC TABLE コマンドを使用して既存の動的テーブルを変更した場合、コマンドは動的テーブルのリフレッシュをトリガーしません。動的テーブルは通常のスケジュールに従ってリフレッシュされます。
ただし、CREATE OR ALTER DYNAMIC TABLE コマンドを使用して新しい動的テーブルを作成し INITIALIZE = ON_CREATE を指定すると、コマンドは動的テーブルのリフレッシュをトリガーします。
アトミック性¶
その CREATE OR ALTER DYNAMIC TABLE コマンドは*アトミック性*を保証しません。これは、CREATE OR ALTER DYNAMIC TABLE ステートメントが実行中に失敗した場合、変更のサブセットがテーブルに適用された可能性があることを意味します。部分的な変更の可能性がある場合の多くで、エラーメッセージには以下のテキストが含まれます。
CREATE OR ALTER execution failed. Partial updates may have been applied.
たとえば、TARGET_LAG プロパティを変更したくて動的テーブルのクラスタリングキーを追加しますが、気が変わってステートメントを終了したと仮定します。この場合、TARGET_LAG プロパティは、クラスタリングキーが適用されていない間に変更される可能性があります。
変更が部分的に適用されると、結果として得られるテーブルは有効な状態になります。前の例では、追加の ALTER DYNAMIC TABLE ステートメントを使用して、元の変更セットを完了できます。
部分更新から復元するには、以下の復元メソッドを試してください。
- 前方修正:CREATE OR ALTER DYNAMIC TABLE ステートメントを再実行します。2回目の試行でステートメントが成功すれば、ターゲット状態が達成されます。 - ステートメントが成功しない場合は、エラーメッセージを調査します。可能であれば、エラーを修正して CREATE OR ALTER DYNAMIC TABLE ステートメントを再実行します。 
- ロールバック:前方修正が不可能な場合は、部分的な変更を手動でロールバックします。 - DESCRIBE DYNAMIC TABLE および SHOW DYNAMIC TABLES コマンドを使用してテーブルの状態を調査します。どの部分的な変更(ある場合)が適用されたかを判断します。 - 部分的な変更が適用された場合は、適切な ALTER DYNAMIC TABLE ステートメントを実行し、動的テーブルを元の状態に戻します。 
 
追加のヘルプが必要な場合は、Snowflakeサポート にお問い合わせください。
例¶
my_dynamic_table という名前の動的テーブルを作成します。
CREATE OR REPLACE DYNAMIC TABLE my_dynamic_table
  TARGET_LAG = '20 minutes'
  WAREHOUSE = mywh
  AS
    SELECT product_id, product_name FROM staging_table;
上記の例では、
- 動的テーブルは、 - staging_tableテーブルの- product_idと- product_name列のクエリの結果を具体化します。
- つまり、動的テーブルのデータは、 - staging_tableのデータより20分以上古くならないことが理想的です。
- 自動リフレッシュプロセスは、ウェアハウス - mywhのコンピューティングリソースを使用して、動的テーブルのデータをリフレッシュします。
my_iceberg_table から読み込む my_dynamic_table という名前のダイナミックIcebergテーブルを作成します。
CREATE DYNAMIC ICEBERG TABLE my_dynamic_table (date TIMESTAMP_NTZ, id NUMBER, content STRING)
  TARGET_LAG = '20 minutes'
  WAREHOUSE = mywh
  EXTERNAL_VOLUME = 'my_external_volume'
  CATALOG = 'SNOWFLAKE'
  BASE_LOCATION = 'my_iceberg_table'
  AS
    SELECT product_id, product_name FROM staging_table;
複数列のクラスタリングキーを持つ動的テーブルを作成します。
CREATE DYNAMIC TABLE my_dynamic_table (date TIMESTAMP_NTZ, id NUMBER, content VARIANT)
  TARGET_LAG = '20 minutes'
  WAREHOUSE = mywh
  CLUSTER BY (date, id)
  AS
    SELECT product_id, product_name FROM staging_table;
指定されたタイムスタンプの日付と時刻に正確に存在する動的テーブルをクローンします。
CREATE DYNAMIC TABLE my_cloned_dynamic_table CLONE my_dynamic_table AT (TIMESTAMP => TO_TIMESTAMP_TZ('04/05/2013 01:02:03', 'mm/dd/yyyy hh24:mi:ss'));
ダイナミックテーブルを構成して、リフレッシュのためにユーザーを要求し、ダイナミックテーブルをリフレッシュします。
CREATE DYNAMIC TABLE my_dynamic_table
  TARGET_LAG = 'DOWNSTREAM'
  WAREHOUSE = mywh
  INITIALIZE = on_schedule
  REQUIRE USER
  AS
    SELECT product_id, product_name FROM staging_table;
ALTER DYNAMIC TABLE my_dynamic_table REFRESH COPY SESSION;
CREATE OR ALTER DYNAMIC TABLE コマンドを使用して動的テーブルを作成します。
CREATE OR ALTER DYNAMIC TABLE my_dynamic_table
  TARGET_LAG = DOWNSTREAM
  WAREHOUSE = mywh
  AS
    SELECT a, b FROM t;
注釈
既存のテーブルの CREATE OR ALTER TABLE ステートメントを実行できるのは、my_dynamic_table に OWNERSHIP 権限を持つロールだけです。
DATA_RETENTION_TIME_IN_DAYS パラメーターを設定するために動的テーブルを変更し、クラスタリングキーを追加します。
CREATE OR ALTER DYNAMIC TABLE my_dynamic_table
 TARGET_LAG = DOWNSTREAM
 WAREHOUSE = mywh
 DATA_RETENTION_TIME_IN_DAYS = 2
 CLUSTER BY (a)
 AS
   SELECT a, b FROM t;
ターゲットラグを変更し、ウェアハウスを変更します。
CREATE OR ALTER DYNAMIC TABLE my_dynamic_table
 TARGET_LAG = '5 minutes'
 WAREHOUSE = my_other_wh
 DATA_RETENTION_TIME_IN_DAYS = 2
 CLUSTER BY (a)
 AS
   SELECT a, b FROM t;
DATA_RETENTION_TIME_IN_DAYS パラメーターの設定を解除します。変更された CREATE OR ALTER DYNAMIC TABLE ステートメントにパラメーターがないことにより、設定が解除されます。この場合、動的テーブルの DATA_RETENTION_TIME_IN_DAYS パラメーターの設定を解除すると、デフォルト値の1にリセットされます。
CREATE OR ALTER DYNAMIC TABLE my_dynamic_table
 TARGET_LAG = '5 minutes'
 WAREHOUSE = my_other_wh
 CLUSTER BY (a)
 AS
   SELECT a, b FROM t;