CREATE DYNAMIC TABLE¶
指定されたクエリに基づいて、 動的テーブル を作成します。
このコマンドは次のバリアントをサポートしています。
CREATE OR ALTER DYNAMIC TABLE:動的テーブルが存在しない場合は動的テーブルを作成するか、既存の動的テーブルを変更します。
CREATE DYNAMIC TABLE FROM BACKUP SET: Restores a dynamic table from a back up.
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>
[ INITIALIZATION_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
When specified, only the mutable region is reinitialized and data in the immutable region is preserved. For more information, see Use immutability constraints on dynamic tables.
以下の動的テーブルプロパティとパラメーターの変更により、再初期化 がトリガーされます。
REFRESH_MODE
クエリまたは列リストへの変更。
既存の列のドロップはサポートされています。
新しい列の追加はサポートされていますが、既存の列の最後にのみ追加できます。
IMMUTABLEWHERE 述語内で使用される列のドロップ、またはクラスタリングキーとして使用される列のドロップはサポートされていません。
詳細については、 CREATE OR ALTER TABLE の使用上の注意 をご参照ください。
CREATE DYNAMIC TABLE FROM BACKUP SET¶
CREATE DYNAMIC TABLE <name> FROM BACKUP SET <backup_set> IDENTIFIER '<backup_id>'
The FROM BACKUP SET clause restores a dynamic table from a backup. You don't specify other table properties because they're all the same as in the backed-up table.
このフォームには CREATEORREPLACE 句がありません。通常は、新しい名前で動的テーブルを復元して、この新しいテーブルからデータまたはその他のオブジェクトを回復させるか、元のテーブルの名前を変更してから、元の名前でテーブルを復元します。
注釈
The backup set is associated with the internal table ID of the original table. Any more backups you add to the backup set use the original table, even if you changed its name. If you want to make backups of the newly restored table, create a new backup set for it.
When you restore a dynamic table from a backup, Snowflake automatically initializes the new table during its first refresh.
For more information about backups, see Backups for disaster recovery and immutable storage.
backup_setSpecifies the name of a backup set created for a specific dynamic table. You can use the SHOW BACKUP SETS command to locate the right backup set.
backup_idSpecifies the identifier of a specific backup within that backup set. You can use the SHOW BACKUPS IN BACKUP SET command to locate the right identifier within the backup set, based on the creation date and time for the backup.
CREATE DYNAMIC TABLE ... CLONE¶
Creates a new dynamic table with the same column definitions and containing all the existing data from the source dynamic table, without actually copying the data.
Cloned dynamic tables, whether cloned directly or as part of a cloned database or schema, are suspended by default. In DYNAMIC_TABLE_GRAPH_HISTORY, this appears as CLONED_AUTO_SUSPENDED in the SCHEDULING_STATE column. Any downstream dynamic tables are also suspended, shown as UPSTREAM_CLONED_AUTO_SUSPENDED. For more information, see 自動動的テーブル一時停止.
また、過去の特定の時点に存在した動的テーブルをクローンすることもできます。詳細については、 クローニングに関する考慮事項 をご参照ください。
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動的テーブルの結果を含むクエリを指定します。
オプションのパラメーター¶
INITIALIZATION_WAREHOUSE = warehouse_nameSpecifies a warehouse to use for all dynamic table initializations and reinitializations.
If this parameter isn't included in the CREATE DYNAMIC TABLE statement, the dynamic table uses the warehouse that is specified by the required WAREHOUSE parameter for all refreshes.
You must use a role that has the USAGE privilege on this warehouse for you to create the dynamic table. For limitations and more information, see 動的テーブルを作成する権限.
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_CREATECOMMENT 'string_literal'列のコメントを指定します。
(コメントは列レベルまたはテーブルレベルで指定できることに注意してください。それぞれの構文は少し異なります。)
MASKING POLICY = policy_name列に設定する マスキングポリシー を指定します。
PROJECTION POLICY policy_name列に設定する 投影ポリシー を指定します。
This parameter is not supported by the CREATE OR ALTER variant syntax.
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または1Enterprise Edition:
永続テーブルの場合は
0~90仮および一時テーブルの場合は
0または1
デフォルト:
Standard Edition:
1Enterprise Edition(またはそれ以上):
1(スキーマ、データベースまたはアカウントレベルで別のデフォルト値が指定されていない場合)
注釈
0の値は、テーブルのTime Travelを効果的に無効化します。MAX_DATA_EXTENSION_TIME_IN_DAYS = integerSnowflakeが動的テーブルのデータ保持期間を延長して、動的テーブル上のストリームが古くなるのを防ぐことができる最大日数を指定するオブジェクトパラメーター。
このパラメーターの詳細については、 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です。
ステートメントでのタグの指定に関する情報については、 Tag quotas をご参照ください。
AGGREGATION POLICY policy_name [ ENTITY KEY ( col_name [ , col_name ... ] ) ]動的テーブルに設定する 集計ポリシー を指定します。テーブルに1つ以上の集計ポリシーを適用できます。
オプションの ENTITY KEY パラメーターを使用して、動的テーブル内でエンティティを一意に識別する列を定義します。詳細については、 集計ポリシーによるエンティティレベルのプライバシーの実装 をご参照ください。集計ポリシーには、1つ以上のエンティティキーを指定できます。
This parameter is not supported by the CREATE OR ALTER variant syntax.
REQUIRE USER指定すると、ユーザーが指定されない限り、ダイナミックテーブルは実行できません。COPY SESSION パラメーターが指定された手動リフレッシュでユーザーが設定されない限り、ダイナミックテーブルはリフレッシュできません。
このオプションを有効にすると、
INITIALIZEの ON_SCHEDULE パラメーターでダイナミックテーブルを作成する必要があります。IMMUTABLE WHERESpecifies a condition that defines the immutable portion of the dynamic table. For more information, see Use immutability constraints on dynamic tables.
BACKFILL FROM <name>データをバックフィルするテーブルを指定します。
Only data defined by the IMMUTABLE WHERE immutability constraint can be backfilled because the backfill data must remain unchanged, even if it differs from the upstream source.
詳細については、 バックフィルを使用して動的テーブルを作成する をご参照ください。
アクセス制御の要件¶
この操作の実行に使用される ロール には、少なくとも次の 権限 が必要です。
権限 |
オブジェクト |
注意 |
|---|---|---|
CREATE DYNAMIC TABLE |
動的テーブルの作成を予定のスキーマ。 |
|
SELECT |
新しい動的テーブルをクエリする予定のテーブル、ビュー、動的テーブル。 |
|
USAGE |
テーブルのリフレッシュに使用する予定のウェアハウス。 |
Operating on an object in a schema requires at least one privilege on the parent database and at least one privilege on the parent schema.
指定された権限のセットを使用してカスタムロールを作成する手順については、 カスタムロールの作成 をご参照ください。
セキュリティ保護可能なオブジェクト に対して SQL アクションを実行するためのロールと権限付与に関する一般的な情報については、 アクセス制御の概要 をご参照ください。
使用上の注意¶
CREATE DYNAMIC TABLE コマンドを実行すると、現在使用中のロールが動的テーブルの所有者になります。このロールは、動的テーブルのリフレッシュをバックグラウンドで実行するために使用されます。
動的テーブルを作成した後にスキーマを変更することはできません。
動的テーブルは、基になるデータベースオブジェクトが変更されると更新されます。変更追跡は、動的テーブルで使用される基になるオブジェクトすべてで有効にする必要があります。変更の追跡を有効にする をご参照ください。
既存の動的テーブルを置き換えたい場合で、現在の定義を確認する必要がある場合は、 GET_DDL 関数を呼び出します。
動的テーブルの定義で ORDER BY を使用すると、予期しない順序でソートされた結果が生成されることがあります。動的テーブルをクエリする際に ORDER BY を使用すると、選択した行が特定の順序で返されるようにすることができます。
Snowflakeは、 ORDER BY を使用して動的テーブルから選択するビューを作成することはサポートしていません。
To influence the order in which rows are stored in a dynamic table, consider enabling clustering.
一部の式、句、および関数は現在、動的テーブルではサポートされていません。包括的なリストについては、 動的テーブルの制限 をご参照ください。
Snowflakeサービスを使用する場合、お客様は、個人データ(ユーザーオブジェクト向け以外)、機密データ、輸出管理データ、またはその他の規制されたデータがメタデータとして入力されていないことを確認する必要があります。詳細については、 Snowflakeのメタデータフィールド をご参照ください。
OR REPLACE 句と IF NOT EXISTS 句は互いに排他的です。この2つを同じステートメントで使うことはできません。
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;