CREATE DYNAMIC TABLE¶
指定されたクエリに基づいて、 動的テーブル を作成します。
このトピックの内容:
構文¶
CREATE [ OR REPLACE ] DYNAMIC TABLE [ IF NOT EXISTS ] <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 }
REFRESH_MODE = { AUTO | FULL | INCREMENTAL }
INITIALIZE = { ON_CREATE | ON_SCHEDULE }
WAREHOUSE = <warehouse_name>
[ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
[ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
[ COMMENT = '<string_literal>' ]
[ [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
AS <query>
バリアント構文¶
CREATE DYNAMIC TABLE ... CLONE¶
データを実際にコピーすることなく、同じ列定義を使用して、ソースの動的テーブルのすべての既存データを含む新しい動的テーブルを作成します。このバリアントは、過去の特定のポイントで動的テーブルをクローンするためにも使用できます。 クローニングに関する考慮事項 をご参照ください。
CREATE [ OR REPLACE ] 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 をご参照ください。
必須パラメーター¶
name
動的テーブルの識別子(つまり、名前)を指定します。動的テーブルが作成されるスキーマに対して一意である必要があります。
また、識別子はアルファベット文字で始まる必要があり、識別子文字列全体が二重引用符で囲まれている場合を除き、スペースや特殊文字を含めることはできません(例:
"My object"
)。二重引用符で囲まれた識別子も大文字と小文字が区別されます。詳細については、 識別子の要件 をご参照ください。
TARGET_LAG = { num { seconds | minutes | hours | days } | DOWNSTREAM }
動的テーブルのラグを指定します。
'num seconds | minutes | hours | days'
動的テーブルのコンテンツがベーステーブルの更新から遅れる最大時間を指定します。
例:
動的テーブルのデータが5分以上遅れないようにするには、
5 minutes
を指定します。動的テーブルのデータが5時間以上遅れないようにするには、
5 hours
を指定します。
最小値は1分です。動的テーブルAが別の動的テーブルBに依存している場合、Aの最小ラグはBのラグ以上にする必要があります。
DOWNSTREAM
動的テーブルが依存する動的テーブルのリフレッシュ時にのみ、動的テーブルをリフレッシュするように指定します。
REFRESH_MODE = { AUTO | FULL | INCREMENTAL }
動的テーブルの 更新タイプ を指定します。このプロパティは、動的テーブルの作成後に変更することはできません。プロパティを変更するには、 CREATE OR REPLACE DYNAMIC TABLE コマンドで動的テーブルを複製します。
AUTO
デフォルトで動的テーブルの増分更新を強制します。CREATE DYNAMIC TABLE ステートメントが増分更新モードをサポートしていない場合、動的テーブルは自動的にフル更新モードで作成されます。
更新モードは SHOW DYNAMIC TABLES ステートメントを使用して確認できます。
refresh_mode
列は使用中の更新モードを表示し、text
列はユーザーが指定したモードを表示します。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
WAREHOUSE = warehouse_name
動的テーブルをリフレッシュするためのコンピューティングリソースを提供するウェアハウスの名前を指定します。
動的テーブルを作成するには、このウェアハウスに対する USAGE 権限が必要です。
AS query
動的テーブルの結果を含むクエリを指定します。
オプションのパラメーター¶
COMMENT 'string_literal'
列のコメントを指定します。
(コメントは列レベルまたはテーブルレベルで指定できることに注意してください。それぞれの構文は少し異なります。)
MASKING POLICY = policy_name
列に設定する マスキングポリシー を指定します。
column_list
列の名前を変更したり、動的テーブルの列にコメントを追加する場合は、列名と(必要に応じて)列に関するコメントを指定する列リストを含めます。列のデータ型を指定する必要はありません。
動的テーブルの列のいずれかが式(例えば、単純な列名だけでない列)に基づいている場合、動的テーブルの各列に列名を指定する必要があります。例えば、次の場合には列名が必要です。
CREATE DYNAMIC TABLE product (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 product (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;
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 ... CLONE バリアントを使用して新しい動的テーブルを作成するときに、元の動的テーブルのアクセス権限を保持するように指定します。
このパラメーターは、既存の動的テーブルから新しい動的テーブルに、 OWNERSHIP を 除く すべての権限をコピーします。新しい動的テーブルは、スキーマ内のオブジェクトタイプに定義された将来の付与を継承 しません。デフォルトでは、 CREATE DYNAMIC TABLE ステートメントを実行するロールが新しい動的テーブルを所有します。
このパラメーターが CREATE DYNAMIC TABLE ステートメントに含まれていない場合、新しい動的テーブルは元の動的テーブルに付与された明示的なアクセス権限を継承 しません が、スキーマ内のオブジェクトタイプに定義された将来の付与は継承します。
注意:
データ共有 の場合、
既存の動的テーブルが別のアカウントと共有されていた場合は、置換する動的テーブルも共有されます。
既存の動的テーブルがデータコンシューマーとしてアカウントと共有され、アクセスがアカウント内の他のロールにさらに許可された場合(親データベースの
GRANT IMPORTED PRIVILEGES
を使用)、置換する動的テーブルにもアクセスが許可されます。
置換する動的テーブルの SHOW GRANTS 出力には、コピーされた権限の被付与者が、ステートメントが実行されたときの現在のタイムスタンプとともに、 CREATE TABLE ステートメントを実行したロールとしてリストされます。
置換する動的テーブルの SHOW GRANTS 出力には、コピーされた権限の被付与者が、ステートメントが実行されたときの現在のタイムスタンプとともに、 CREATE TABLE ステートメントを実行したロールとしてリストされます。
許可をコピーする操作は、 CREATE DYNAMIC TABLE コマンドで(つまり、同じトランザクション内で)アトミックに発生します。
ROW ACCESS POLICY policy_name ON ( col_name [ , col_name ... ] )
動的テーブルに設定する 行アクセスポリシー を指定します。
TAG ( tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] )
タグ の名前とタグ文字列の値を指定します。
タグ値は常に文字列であり、タグ値の最大文字数は256です。
ステートメントでのタグの指定に関する情報については、 オブジェクトおよび列のタグクォータ をご参照ください。
アクセス制御の要件¶
この SQL コマンドの実行に使用される ロール には、少なくとも次の 権限 が必要です。
権限 |
オブジェクト |
メモ |
---|---|---|
CREATE DYNAMIC TABLE |
動的テーブルの作成を予定のスキーマ。 |
|
SELECT |
新しい動的テーブルをクエリする予定のテーブル、ビュー、動的テーブル。 |
|
USAGE |
テーブルのリフレッシュに使用する予定のウェアハウス。 |
スキーマ内の任意のオブジェクトを操作するには、親データベースとスキーマに対する USAGE 権限も必要であることに注意してください。
指定された権限のセットを使用してカスタムロールを作成する手順については、 カスタムロールの作成 をご参照ください。
セキュリティ保護可能なオブジェクト に対して SQL アクションを実行するためのロールと権限付与に関する一般的な情報については、 アクセス制御の概要 をご参照ください。
使用上の注意¶
CREATE DYNAMIC TABLE コマンドを実行すると、現在使用中のロールが動的テーブルの所有者になります。このロールは、動的テーブルのリフレッシュをバックグラウンドで実行するために使用されます。
動的テーブルを作成した後にスキーマを変更することはできません。
動的テーブルは、基になるデータベースオブジェクトが変更されると更新されます。変更追跡は、動的テーブルで使用される基になるオブジェクトすべてで有効にする必要があります。 変更の追跡を有効にする をご参照ください。
既存の動的テーブルを置き換えたい場合で、現在の定義を確認する必要がある場合は、 GET_DDL 関数を呼び出します。
一部の式、句、および関数は現在、動的テーブルではサポートされていません。包括的なリストについては、 動的テーブルの既知の制限 をご参照ください。
Snowflakeサービスを使用する場合、お客様は、個人データ(ユーザーオブジェクト向け以外)、機密データ、輸出管理データ、またはその他の規制されたデータがメタデータとして入力されていないことを確認する必要があります。詳細については、 Snowflakeのメタデータフィールド をご参照ください。
例¶
product
という名前の動的テーブルを作成します。
CREATE OR REPLACE DYNAMIC TABLE product 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
のコンピューティングリソースを使用して、動的テーブルのデータをリフレッシュします。
指定されたタイムスタンプの日付と時刻に正確に存在する動的テーブルをクローンします。
CREATE DYNAMIC TABLE orders_clone_restore CLONE orders AT (TIMESTAMP => TO_TIMESTAMP_TZ('04/05/2013 01:02:03', 'mm/dd/yyyy hh24:mi:ss'));