CREATE DYNAMIC TABLE

指定されたクエリに基づいて、 動的テーブル を作成します。

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

ALTER DYNAMIC TABLEDESCRIBE DYNAMIC TABLEDROP DYNAMIC TABLESHOW DYNAMIC TABLES

このトピックの内容:

構文

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 ] 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>
  [ 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>' ]
  [ [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
  [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
  AS <query>
Copy

バリアント構文

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>
  ]
Copy

ソースの動的テーブルにクラスタリングキーがある場合は、クローンされた動的テーブルにもクラスタリングキーがあります。デフォルトでは、ソーステーブルに対して自動クラスタリングが中断されていなくても、新しいテーブルに対しては自動クラスタリングが中断されます。

クローンの詳細については、 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 = '<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>' ]
[ [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
AS <query>
Copy

使用方法と制限の詳細については、 動的 Apache Iceberg™ テーブルを作成する をご参照ください。

必須パラメーター

name

動的テーブルの識別子(つまり、名前)を指定します。動的テーブルが作成されるスキーマに対して一意である必要があります。

また、識別子はアルファベット文字で始まる必要があり、識別子文字列全体が二重引用符で囲まれている場合を除き、スペースや特殊文字を含めることはできません(例: "My object")。二重引用符で囲まれた識別子も大文字と小文字が区別されます。

詳細については、 識別子の要件 をご参照ください。

TARGET_LAG = { num { seconds | minutes | hours | days } | DOWNSTREAM }

動的テーブルのラグを指定します。

'num seconds | minutes | hours | days'

動的テーブルのコンテンツがベーステーブルの更新から遅れる最大時間を指定します。

例:

  • 動的テーブルのデータが5分以上遅れないようにするには、 5 minutes を指定します。

  • 動的テーブルのデータが5時間以上遅れないようにするには、 5 hours を指定します。

動的テーブルが他の動的テーブルに依存する場合、最小ターゲット・ラグは依存する動的テーブルのターゲット・ラグ以上である必要があります。

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

列に設定する マスキングポリシー を指定します。

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;
Copy

列ごとにオプションのコメントを指定できます。例:

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;
Copy
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:

    • 永続テーブルの場合は 090

    • 仮および一時テーブルの場合は 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 関数を呼び出します。

  • 動的テーブルの定義で ORDER BY を使用すると、予期しない順序でソートされた結果が生成されることがあります。動的テーブルをクエリする際に ORDER BY を使用すると、選択した行が特定の順序で返されるようにすることができます。

  • Snowflakeは、 ORDER BY を使用して動的テーブルから選択するビューを作成することはサポートしていません。

  • 一部の式、句、および関数は現在、動的テーブルではサポートされていません。包括的なリストについては、 動的テーブルの既知の制限 をご参照ください。

  • Snowflakeサービスを使用する場合、お客様は、個人データ(ユーザーオブジェクト向け以外)、機密データ、輸出管理データ、またはその他の規制されたデータがメタデータとして入力されていないことを確認する必要があります。詳細については、 Snowflakeのメタデータフィールド をご参照ください。

product という名前の動的テーブルを作成します。

CREATE OR REPLACE DYNAMIC TABLE product
 TARGET_LAG = '20 minutes'
  WAREHOUSE = mywh
  AS
    SELECT product_id, product_name FROM staging_table;
Copy

上記の例では、

  • 動的テーブルは、 staging_table テーブルの product_idproduct_name 列のクエリの結果を具体化します。

  • つまり、動的テーブルのデータは、 staging_table のデータより20分以上古くならないことが理想的です。

  • 自動リフレッシュプロセスは、ウェアハウス mywh のコンピューティングリソースを使用して、動的テーブルのデータをリフレッシュします。

my_iceberg_table から読み込む product という名前のダイナミックIcebergテーブルを作成します。

CREATE DYNAMIC ICEBERG TABLE product (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;
Copy

複数列のクラスタリングキーを持つテーブルを作成します。

CREATE DYNAMIC TABLE product (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;
Copy

指定されたタイムスタンプの日付と時刻に正確に存在する動的テーブルをクローンします。

CREATE DYNAMIC TABLE product_clone CLONE product AT (TIMESTAMP => TO_TIMESTAMP_TZ('04/05/2013 01:02:03', 'mm/dd/yyyy hh24:mi:ss'));
Copy