CREATE TASK¶
現在/指定されたスキーマに新しいタスクを作成するか、既存のタスクを置き換えます。
このコマンドは、次のバリアントもサポートしています。
CREATE TASK ... CLONE (既存のタスクのクローンを作成)
- こちらもご参照ください。
重要
新しく作成されたタスクまたは複製されたタスクは、中断状態で作成されます。中断されたタスクの再開については、 ALTER TASK ... RESUME をご参照ください。
構文¶
CREATE [ OR REPLACE ] TASK [ IF NOT EXISTS ] <name>
[ { WAREHOUSE = <string> } | { USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = <string> } ]
[ SCHEDULE = '{ <num> MINUTE | USING CRON <expr> <time_zone> }' ]
[ CONFIG = <configuration_string> ]
[ ALLOW_OVERLAPPING_EXECUTION = TRUE | FALSE ]
[ <session_parameter> = <value> [ , <session_parameter> = <value> ... ] ]
[ USER_TASK_TIMEOUT_MS = <num> ]
[ SUSPEND_TASK_AFTER_NUM_FAILURES = <num> ]
[ ERROR_INTEGRATION = <integration_name> ]
[ COMMENT = '<string_literal>' ]
[ FINALIZE = <string> ]
[ TASK_AUTO_RETRY_ATTEMPTS = <num> ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
[ AFTER <string> [ , <string> , ... ] ]
[ WHEN <boolean_expr> ]
AS
<sql>
バリアント構文¶
CREATE TASK ... CLONE
同じパラメーター値で新しいタスクを作成します。
CREATE [ OR REPLACE ] TASK <name> CLONE <source_task> [ ... ]
詳細については、 CREATE <オブジェクト> ... CLONE をご参照ください。
注釈
CREATE TASK <名前> CLONE を使用してタスクをクローンするか、タスクを含むスキーマをクローンすると、明示的にオーバーライドされない限り、基になるすべてのタスクプロパティがコピーされます。
必須パラメーター¶
name
タスクの識別子を指定する文字列。タスクが作成されるスキーマに対して一意である必要があります。
また、識別子はアルファベット文字で始まる必要があり、
"My object"
のように識別子文字列全体が二重引用符で囲まれている場合を除き、スペースや特殊文字を含めることはできません。二重引用符で囲まれた識別子も大文字と小文字が区別されます。詳細については、 識別子の要件 をご参照ください。
sql
次のいずれかを使用します。
単一の SQL ステートメント
ストアドプロシージャへの呼び出し
Snowflakeスクリプト を使用した手続き型ロジック
現在、 Snowsight と Classic Console では、Snowflakeスクリプトを使用するためのタスクの作成または変更をサポートしていないことに注意してください。代わりに、 SnowSQL または別のコマンドラインクライアントを使用してください。
SQL コードは、タスク実行時に実行されます。
注釈
SQL コードは、それ自体で実行できる 必要があります。タスクを作成する 前 に、
sql
が期待どおりに実行されることを確認することを強くお勧めします。タスクは、すでに徹底的にテストされている SQL ステートメントとストアドプロシージャを自動化することを目的としています。サーバーレスタスクは、次のオブジェクト型を呼び出すことはできません。
JavaまたはPythonコードを含むUDFs(ユーザー定義関数)。
Scalaで(Snowparkを使用して)作成された、またはJavaまたはPythonコードを含むUDFsを呼び出すストアドプロシージャ。
オプションのパラメーター¶
WAREHOUSE = string
または . USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = string
WAREHOUSE = string
タスク実行用のコンピューティングリソースを提供する仮想ウェアハウスを指定します。
このタスクの実行にサーバーレスコンピューティングリソースを使用するには、このパラメーターを省略します。Snowflakeは、ワークロードごとに必要なサーバーレスコンピューティングリソースのサイズ変更とスケーリングを自動的に行います。タスクにスケジュールが指定されると、Snowflakeはリソースサイズを調整して、指定された時間枠内にタスクの将来の実行を完了します。タスクの初期ウェアハウスサイズを指定するには、
USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = string
パラメーターを設定します。USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = string
サーバーレスタスクにのみ適用されます。
Snowflakeが理想的なサイズを決定するためにタスク履歴を使用できるようになる前に、タスクの最初の実行にプロビジョニングするコンピューティングリソースのサイズを指定します。タスクが数回の実行を正常に完了すると、Snowflakeはこのパラメーター設定を無視します。
特定のタスクでタスク履歴が利用できない場合、コンピューティングリソースはこの初期サイズに戻ることに注意してください。
注釈
WAREHOUSE = string
パラメーター値が指定されている場合は、このパラメーターを設定するとユーザーエラーが発生します。サイズは、
SMALL
、MEDIUM
、またはLARGE
など、ウェアハウスの作成時に使用可能なコンピューティングリソース(CREATE WAREHOUSE を使用)と同等です。パラメーターでサポートされる最大サイズはXXLARGE
です。パラメーターを省略した場合、タスクの最初の実行はMサイズ(MEDIUM
)のウェアハウスを使用して実行されます。初期サイズは、タスクが作成された 後、正常に1度実行される 前 であれば変更できます(ALTER TASK を使用)。このタスクの最初の実行を開始した後にパラメーターを変更しても、現在または将来のタスク実行のコンピューティングリソースには影響しません。
タスクを中断および再開しても、コンピューティングリソースのサイズ設定に使用されたタスク履歴は削除されないことに注意してください。タスク履歴は、タスクが再作成された場合にのみ削除されます(CREATE OR REPLACE TASK 構文を使用)。
このパラメーターの詳細については、 USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE をご参照ください。
SCHEDULE ...
タスクを定期的に実行するスケジュールを指定します。
注釈
スケジュールは、スタンドアロンタスクまたは タスクグラフ 内のルートタスクに対して定義する 必要 があります。それ以外の場合、タスクは EXECUTE TASK を使用して手動で実行された場合にのみ実行されます。
タスクグラフの子タスクにスケジュールを指定することは できません。
USING CRON expr time_zone
タスクを定期的に実行するためのcron式とタイムゾーンを指定します。標準のcronユーティリティ構文のサブセットをサポートします。
タイムゾーンのリストについては、 tzデータベースタイムゾーンのリスト (Wikipedia)をご参照ください。
cron式は、次のフィールドで構成されます。
# __________ minute (0-59) # | ________ hour (0-23) # | | ______ day of month (1-31, or L) # | | | ____ month (1-12, JAN-DEC) # | | | | _ day of week (0-6, SUN-SAT, or L) # | | | | | # | | | | | * * * * *
次の特殊文字がサポートされています。
*
ワイルドカード。フィールドのオカレンスを指定します。
L
「最後」の略。曜日フィールドで使用すると、特定の月の「最後の金曜日」(「5L」)などの構造を指定できます。月の日フィールドでは、月の最後の日を指定します。
/n
特定の時間単位の nth インスタンスを示します。時間の各クォンタムは独立して計算されます。たとえば、月フィールドに
4/3
が指定されている場合、タスクは4月、7月、および10月、つまり、年の4番目の月から始まり、3か月ごとにスケジュールされます。その後も同じスケジュールが維持されます。つまり、タスクは1月(10月の実行から3か月後)に実行されるようにスケジュールされては いません。
注釈
cron式は現在、指定されたタイムゾーンに対してのみ評価します。アカウントの TIMEZONE パラメーター値を変更(またはユーザーレベルまたはセッションレベルで値を設定)しても、タスクのタイムゾーンは 変更されません 。
cron式は、タスクのすべての 有効 実行時間を定義します。Snowflakeは、このスケジュールに基づいてタスクを実行しようとします。ただし、次の有効な実行時間が始まる前に前の実行が完了していない場合、有効な実行時間はスキップされます。
特定の月と曜日の両方がcron式に含まれている場合、タスクは月または曜日の いずれか を満たす日にスケジュールされます。例えば、
SCHEDULE = 'USING CRON 0 0 10-20 * TUE,THU UTC'
は、月の10日から20日、およびそれらの日付以外の火曜日または木曜日に、 0AM でタスクをスケジュールします。cronでの時間の最小粒度は分です。cron式で定義された分の間にタスクが再開された場合、最初にスケジュールされたタスクの実行は、cron式のインスタンスの次回発生です。たとえば、毎日午前0時(
USING CRON 0 0 * * *
)に実行するようにスケジュールされたタスクが、午前0時+5秒(00:00:05
)に再開される場合、最初のタスクの実行は次の午前0時にスケジュールされます。
num MINUTE
タスクの実行間に挿入される待機時間の間隔(分単位)を指定します。正の整数のみを受け入れます。
num M
構文もサポートしています。あいまいさを避けるために、次の場合には 基本間隔時間 が設定されます。
タスクが再開された場合( ALTER TASK ... RESUME を使用) または
異なる間隔が設定されている場合( ALTER TASK ... SET SCHEDULE を使用)
基本間隔時間は、現在のクロック時間から間隔カウンターを開始します。たとえば、
10
の INTERVAL 値が設定され、タスクが9:03 AM で有効になっている場合、タスクは9:13 AM、9:23 AMというふうに実行されます。絶対精度を確保するために最善を尽くしますが、保証は、設定された間隔の 前 にタスクが実行されないようにすることのみに限定されます。たとえば、現在の例では、タスクが最初に実行されるのは9:14 AM で、9:12 AM には実行されません。注釈
サポートされる最大値は
11520
(8日間)です。num MINUTE
の値がこれよりも大きいタスクは実行されません。
CONFIG = configuration_string
タスクグラフ内のすべてのタスクによりアクセス可能なキーと値のペアを文字列で指定します。JSON 形式にする必要があります。現在実行中のタスクの構成文字列の取得の詳細については、 SYSTEM$GET_TASK_GRAPH_CONFIG をご参照ください。
注釈
このパラメーターは、ルートタスクでのみ設定できます。この設定は、タスクグラフ内のすべてのタスクに適用されます。
このパラメーターはスタンドアロンタスクに設定できますが、タスクの動作には影響しません。Snowflakeは、スタンドアロンタスクの1つのインスタンスのみが特定の時間に実行されていることを確認します。
ALLOW_OVERLAPPING_EXECUTION = TRUE | FALSE
タスクグラフの複数のインスタンスを同時に実行できるようにするかどうかを指定します。
注釈
このパラメーターは、ルートタスクでのみ設定できます。この設定は、タスクグラフ内のすべてのタスクに適用されます。
このパラメーターはスタンドアロンタスクに設定できますが、タスクの動作には影響しません。Snowflakeは、スタンドアロンタスクの1つのインスタンスのみが特定の時間に実行されていることを確認します。
TRUE
はルートタスクの1つのインスタンスのみが特定の時間に実行されていることを確認します。次の実行スケジュールが開始する際に、ルートタスクがまだ実行されている場合、そのスケジュールされた時間はスキップされます。この保証は子タスクには適用されません。子タスクの現在の実行がまだ動作している間にルートタスクの次のスケジュールが実行されると、タスクグラフの別のインスタンスが開始されます。FALSE
は、特定のタスクグラフのインスタンス1つのみが一度に実行できるようにします。ルートタスクの次の実行は、タスクグラフ内にあるすべての子タスクの実行が終了した後にのみスケジュールされます。これは、タスクグラフ内のすべてのタスクを実行するために必要な累積時間がルートタスクの定義で設定された、明示的にスケジュールされた時間を超える場合、タスクグラフの少なくとも1つの実行がスキップされることを意味します。
デフォルト:
FALSE
session_parameter = value [ , session_parameter = value ... ]
タスクの実行時にセッションに設定するセッションパラメーターのコンマ区切りリストを指定します。タスクはすべてのセッションパラメーターをサポートします。完全なリストについては、 セッションパラメーター をご参照ください。
USER_TASK_TIMEOUT_MS = num
タスクがタイムアウトするまでの1回の実行の制限時間(ミリ秒単位)を指定します。
注釈
タスクの制限時間を大幅に増やす前に、タスクによって開始された SQL ステートメントを最適化できるか(ステートメントを書き換えるか、ストアドプロシージャを使用して)、ウェアハウスのサイズを増やす必要があるかどうかを検討してください。
状況によっては、パラメーターSTATEMENT_TIMEOUT_IN_SECONDSの優先順位がUSER_TASK_TIMEOUT_MSよりも高くなります。詳細については、 STATEMENT_TIMEOUT_IN_SECONDS をご参照ください。
このパラメーターの詳細については、 USER_TASK_TIMEOUT_MS をご参照ください。
値:
0
-86400000
(1日)。デフォルト:
3600000
(1時間)SUSPEND_TASK_AFTER_NUM_FAILURES = num
現在のタスクが自動的に中断されるまでに連続して失敗したタスク実行の回数を指定します。失敗したタスク実行には、タスク本体の SQL コードがユーザーエラーを生成するかタイムアウトになった実行が含まれます。スキップ、キャンセル、またはシステムエラーが原因で失敗したタスク実行は不確定とみなされ、失敗したタスク実行の数には含まれません。
スタンドアロンタスクまたはタスクグラフ内のルートタスクにパラメーターを設定します。パラメーターが
0
より大きい値に設定されている場合、次の動作がスタンドアロンタスクまたはタスクグラフの実行に適用されます。スタンドアロンタスクは、指定された数の連続したタスクの実行が失敗するかタイムアウトになると、自動的に中断します。
ルートタスクは、タスクグラフ内にある 任意 の単一タスクの実行が、連続した実行で指定された回数失敗するかタイムアウトした後、自動的に中断します。
パラメーターを
0
に設定すると、失敗したタスクは自動的に中断されません。この設定は、サーバーレスのコンピューティングリソースまたは仮想ウェアハウスのコンピューティングリソースに依存するタスクに適用されます。
このパラメーターの詳細については、 SUSPEND_TASK_AFTER_NUM_FAILURES をご参照ください。
値:
0
- 上限なし。デフォルト:
10
ERROR_INTEGRATION = 'integration_name'
Amazon Simple Notification Service(SNS)、Microsoft Azure Event Grid、またはGoogle Pub/Subを使用して、エラー通知を送信するようにタスクを設定する場合にのみ必要です。
Amazon SNS、 MS Azure Event Grid、またはGoogle Pub/Subとの通信に使用する通知統合の名前を指定します。詳細については、 タスクのエラー通知の有効化 をご参照ください。
COMMENT = 'string_literal'
タスクのコメントを指定します。
デフォルト: 値なし
AFTER string [ , string , ... ]
現在のタスクに対する1つ以上の先行タスクを指定します。このオプションを使用して、 タスクグラフの を作成するか、このタスクを既存のタスクグラフに追加します。タスクグラフは、スケジュールされたルートタスクで始まり、依存関係によって相互にリンクされる一連のタスクです。
タスクグラフの構造は、そのすべてのコンポーネントタスクが作成された後に定義できることに注意してください。 ALTER TASK ... ADD AFTER ステートメントを実行して、計画されたタスクグラフの各タスクの先行タスクを指定します。
タスクは、先行タスクが実行を正常に終了した後(短い遅延の後)に実行されます。
注釈
ルートタスクには、定義済みのスケジュールが必要です。タスクをリンクするため、各子タスクには、
AFTER
パラメーターを使用して指定された1つ以上の定義済みの先行タスクが必要です。単一のタスクは、100先行タスクと100子タスクに制限されています。さらに、タスクグラフは、再開状態または中断状態のいずれかにおいて、 合計 で最大1000タスク(ルートタスクを含む)に制限されます。
アカウントは現在、最大30000件の再開タスクに制限されています。
タスクグラフ内にあるタスクすべては同じタスク所有者である必要があります。単一のロールには、タスクグラフ内にあるすべてのタスクに対する OWNERSHIP 権限が必要です。
タスクグラフ内にあるすべてのタスクは、同じスキーマに存在している必要があります。
ルートタスクは、 任意の タスクが再作成される(CREATE OR REPLACE TASK 構文を使用)、または子タスクが追加される(CREATE TASK ... AFTER または ALTER TASK ... ADD AFTER を使用)か削除される(ALTER TASK ... REMOVE AFTER)前に中断する必要があります。
タスクグラフ内にあるタスクのいずれかがクローンされると、タスクをクローンするロールがデフォルトでクローンの所有者になります。
元のタスクの所有者がクローンを作成すると、タスククローンはタスクと先行タスクの間のリンクを保持します。これは、同じ先行タスクが元のタスクとタスククローンの両方をトリガーすることを意味します。
別のロールがクローンを作成する場合、タスククローンはスケジュールを持てますが、先行タスクは持てません。
現在の制限:
Snowflakeは、定義されたスケジュールを持つタスクの最大1つのインスタンスが特定の時間に実行されることを保証します。ただし、定義済みの先行タスクを持つタスクに対して同じ保証を提供することはできません。
WHEN boolean_expr
ブール SQL 式を指定します。 AND/OR で結合された複数の条件がサポートされています。(
SCHEDULE
またはAFTER
設定に基づいて)タスクがトリガーされると、式の条件を検証して、実行するかどうかを決定します。式の条件が 満たされない 場合、タスクは現在の実行をスキップします。このタスクを先行タスクとして識別するタスクも実行されません。タスク WHEN 句では、以下がサポートされています。
SYSTEM$STREAM_HAS_DATA は、 SQL 式の評価でサポートされています。
この関数は、指定されたストリームに変更追跡データが含まれているかどうかを示します。この関数を使用して、現在の実行を開始する前に、指定されたストリームに変更データが含まれているかどうかを評価することができます。結果が FALSE の場合、タスクは実行されません。
注釈
SYSTEM$STREAM_HAS_DATA は、ストリームに変更データが含まれていても FALSE 値を返すことを回避するように設計されています。ただし、この関数でストリームに変更データが含まれてない場合に TRUE を返すことを回避できる保証はありません。
SYSTEM$GET_PREDECESSOR_RETURN_VALUE は、 SQL 式の評価でサポートされています。
この関数は、タスクグラフにある先行タスクの戻り値を取得します。戻り値はブーリアン式の一部として使用できます。SYSTEM$GET_PREDECESSOR_RETURN_VALUE を使用する場合に、戻り値を必要に応じて適切な数値型、文字列型、またはブーリアン型にキャストすることができます。
簡単な例は次のとおりです。
WHEN NOT SYSTEM$GET_PREDECESSOR_RETURN_VALUE('task_name')::BOOLEAN
WHEN SYSTEM$GET_PREDECESSOR_RETURN_VALUE('task_name') != 'VALIDATION'
WHEN SYSTEM$GET_PREDECESSOR_RETURN_VALUE('task_name')::FLOAT < 0.2
注釈
TASK ... WHEN 式で PARSE_JSON 使用することは、ウェアハウスベースのコンピューティングリソースが必要なため、サポートされていません。
AND、 OR、 NOT などの ブーリアン演算子。
数値型、文字列型、ブーリアン型の間でキャストします。
等しい、等しくない、より大きい、より小さいなどの 比較演算子。
WHEN 式の条件の検証にコンピューティングリソースは必要ありません。代わりに、検証はクラウドサービスレイヤーで処理されます。タスクが WHEN 条件を評価して実行しないたびに、わずかな料金が発生します。タスクが実行されるまで、タスクがトリガーされるたびに料金が累積されます。その時点で、料金はSnowflakeクレジットに変換され、タスク実行のコンピューティングリソース使用量に追加されます。
一般に、条件を検証するための計算時間は、タスクの実行時間と比較して重要ではありません。ベストプラクティスとして、スケジュールされたタスクと実際のタスクの実行を可能な限り一致させます。タスクの実行と一致しないタスクのスケジュールは避けます。たとえば、データがおよそ24時間ごとにストリームのあるテーブルに挿入される場合、毎分ストリームデータをチェックするタスクはスケジュールしないでください。各実行で WHEN 式を検証するための料金は、通常は重要ではありませんが、料金は累積されます。
コンピューティングリソース1日あたりの使用量の10%クォータ を下回るクラウドサービス1日あたりの消費量は、クラウドサービスの料金に累積されません。
TAG ( tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] )
タグ の名前とタグ文字列の値を指定します。
タグ値は常に文字列であり、タグ値の最大文字数は256です。
ステートメントでのタグの指定に関する情報については、 オブジェクトおよび列のタグクォータ をご参照ください。
FINALIZE = string
ファイナライザータスクが関連付けられているルートタスクの名前を指定します。ファイナライザータスクは、タスクグラフが使用するリソースのリリースとクリーンアップを扱います。ファイナライザータスクは、グラフが実行されると実行が保証されます。ただし、グラフがスキップされた場合(たとえば、ルートタスクがスキップされた場合)、ファイナライザータスクは実行されません。
ルートタスクにはファイナライザータスクを1つのみ指定できます。ルートタスクに対して複数のファイナライザータスクを作成すると、タスクの作成に失敗します。
ファイナライザータスクには子タスクを指定できません。ファイナライザータスクを先行タスクにしようとするコマンドは失敗します。
ファイナライザータスクにはスケジュールを指定できません。スケジュール付きファイナライザータスクの作成は失敗します。
デフォルト: 値なし
TASK_AUTO_RETRY_ATTEMPTS = num
タスクグラフの自動再試行回数を指定します。タスクグラフが FAILED の状態で完了した場合、Snowflakeは自動的に失敗したグラフの最後のタスクからタスクグラフを再試行することができます。
タスクグラフの自動再試行はデフォルトでは無効になっています。この機能を有効にするには、タスクグラフのルートタスクで TASK_AUTO_RETRY_ATTEMPTS を
0
より大きい値に設定します。このパラメーターは、タスクグラフのルートタスクに設定する必要があることに注意してください。子タスクに設定されている場合は、エラーが返されます。
値:
0
~30
デフォルト:
0
アクセス制御の要件¶
この SQL コマンドの実行に使用される ロール には、少なくとも次の 権限 が必要です。
権限 |
オブジェクト |
メモ |
---|---|---|
EXECUTE MANAGED TASK |
アカウント |
実行でサーバーレスコンピューティングリソースに依存するタスクにのみ必要です。 |
CREATE TASK |
スキーマ |
|
USAGE |
ウェアハウス |
実行のためにユーザー管理のウェアハウスに依存するタスクにのみ必要です。 |
スキーマ内の任意のオブジェクトを操作するには、親データベースとスキーマに対する USAGE 権限も必要であることに注意してください。
指定された権限のセットを使用してカスタムロールを作成する手順については、 カスタムロールの作成 をご参照ください。
セキュリティ保護可能なオブジェクト に対して SQL アクションを実行するためのロールと権限付与に関する一般的な情報については、 アクセス制御の概要 をご参照ください。
使用上の注意¶
タスクは、タスク所有者の権限を使用して実行されます。タスクを実行するために最低限必要な権限のリストについては、 タスクセキュリティ をご参照ください。
タスク定義に含める 前 に、 SQL ステートメントを実行するか、ストアドプロシージャを呼び出すことをお勧めします。タスク所有者のロールとしてこのステップを完了し、そのロールが SQL によって参照される任意のオブジェクトに対して必要な権限すべてを持っていることを確認します。
タスクの個々の実行に対するコンピューティングリソースは、サーバーレスタスクまたはユーザー指定の仮想ウェアハウスの いずれか によって管理されます。サーバーレスタスクを使用するには、 CREATE TASK ステートメントの
WAREHOUSE = string
パラメーターを省略します。タスクのサーバーレスコンピューティングリソースは、ウェアハウスサイズで
XSMALL
からXXLARGE
に相当する範囲になります。この範囲にさらに大きなウェアハウスサイズを含める場合は、 Snowflakeサポート に連絡してサイズの拡大をリクエストしてください。サーバーレスモデルは、タスクグラフ内の1つ以上のタスクに対して有効にできます。タスクグラフ内にある個々のタスクの実行は、サーバーレスまたはユーザー管理のコンピューティングリソースのいずれかに依存します。タスクグラフ内にある すべて のタスクに対してこのサーバーレスコンピューティングモデルを有効にする必要はありません。
タスクを作成した後、タスク定義で指定されたパラメーターに基づいてタスクが実行される前に、 ALTER TASK ... RESUME を実行する 必要 があります。アカウントは現在、最大30000件の再開タスクに制限されていることに注意してください。
さらに、タスクがクローンされると、クローンされたタスクの実行はデフォルトで中断されるため、同じコマンドを使用して明示的に有効にする必要があります。
タスクが予期しないエラーで失敗した場合、エラーに関する通知を受け取ることができます。タスクエラー通知の構成の詳細については、 タスクのエラー通知の有効化 をご参照ください。
デフォルトでは、トランザクションを明示的に開始せずに実行された DML ステートメントは、成功時には自動的にコミットされ、失敗時にはステートメントの最後でロールバックされます。この動作は 自動コミット と呼ばれ、 AUTOCOMMIT パラメーターで制御されます。このパラメーターは TRUE に設定する 必要があります。アカウントレベルで AUTOCOMMIT パラメーターが FALSE に設定されている場合、個々のタスクのパラメーターを TRUE に設定します( ALTER TASK ... SET AUTOCOMMIT = TRUEを使用)。それ以外では、タスクによって実行されるどのような DML ステートメントも失敗します。
単一のテーブルストリームから変更データを消費する複数のタスクは、異なるデルタを取得します。タスクが DML ステートメントを使用してストリーム内の変更データを消費すると、ストリームはオフセットを進めます。変更データは、次に消費するタスクで使用できなくなります。現在は、単一のタスクのみがストリームの変更データを消費することをお勧めします。同じテーブルに対して複数のストリームを作成し、異なるタスクで使用できます。
CREATE OR REPLACE 構文を使用すると、既存のタスクが削除され、指定された定義を使用して再作成されます。次の動作に注意してください。
再作成されたタスクは、デフォルトで中断されます。
タスクのいずれかの現在の実行(TASK_HISTORY 出力で EXECUTING 状態の実行など)が完了します。指定されたタスクの実行を中止するには、 SYSTEM$USER_TASK_CANCEL_ONGOING_EXECUTIONS 関数を実行します。
スタンドアロンまたはルートタスクが再作成されると、次にスケジュールされているタスクの実行がキャンセルされます。
CREATE OR REPLACE <オブジェクト> ステートメントはアトミックです。つまり、オブジェクトが置き換えられると、単一のトランザクションで、古いオブジェクトが削除されて新しいオブジェクトが作成されます。
メタデータについて:
注意
Snowflakeサービスを使用する場合、お客様は、個人データ(ユーザーオブジェクト向け以外)、機密データ、輸出管理データ、またはその他の規制されたデータがメタデータとして入力されていないことを確認する必要があります。詳細については、 Snowflakeのメタデータフィールド をご参照ください。
例¶
単一の SQL ステートメント¶
日曜日(米国/ロサンゼルスタイムゾーン)の9 AM から5 PM までの1時間ごとに、現在のタイムスタンプをクエリするサーバーレスタスクを作成します。
初期のウェアハウスサイズは XSMALL です。
CREATE TASK t1
SCHEDULE = 'USING CRON 0 9-17 * * SUN America/Los_Angeles'
USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = 'XSMALL'
AS
SELECT CURRENT_TIMESTAMP;
前の例と同じですが、タスクはユーザー管理のウェアハウスに依存して、実行用のコンピューティングリソースを提供します。
CREATE TASK mytask_hour
WAREHOUSE = mywh
SCHEDULE = 'USING CRON 0 9-17 * * SUN America/Los_Angeles'
AS
SELECT CURRENT_TIMESTAMP;
追加のタイミング例:
SCHEDULE 値 |
説明 |
---|---|
|
毎分。UTC タイムゾーン。 |
|
毎晩2 AM。UTC タイムゾーン。 |
|
毎日2回、5 AM と5 PM (時間の一番上)。UTC タイムゾーン。 |
|
6月、月末の2:30 AM。UTC タイムゾーン。 |
1時間ごとに現在のタイムスタンプをテーブルに挿入するサーバーレスタスクを作成します。タスクは、タスクが実行されるセッションの TIMESTAMP_INPUT_FORMAT パラメーターを設定します。このセッションパラメーターは、挿入されたタイムスタンプの形式を指定します。
CREATE TASK t1
SCHEDULE = '60 MINUTE'
TIMESTAMP_INPUT_FORMAT = 'YYYY-MM-DD HH24'
USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = 'XSMALL'
AS
INSERT INTO mytable(ts) VALUES(CURRENT_TIMESTAMP);
5分ごとに現在のタイムスタンプをテーブルに挿入するタスクを作成します。
CREATE TASK mytask_minute
WAREHOUSE = mywh
SCHEDULE = '5 MINUTE'
AS
INSERT INTO mytable(ts) VALUES(CURRENT_TIMESTAMP);
5分ごとに、ストリームから INSERT 操作の変更追跡データをテーブルに挿入するタスクを作成します。タスクは SYSTEM$STREAM_HAS_DATA 関数を使用してストリームをポーリングし、変更データが存在するかどうかを判断し、結果が FALSE
の場合、現在の実行をスキップします。
CREATE TASK mytask1
WAREHOUSE = mywh
SCHEDULE = '5 minute'
WHEN
SYSTEM$STREAM_HAS_DATA('MYSTREAM')
AS
INSERT INTO mytable1(id,name) SELECT id, name FROM mystream WHERE METADATA$ACTION = 'INSERT';
タスクグラフにサーバーレスの子タスクを作成し、複数の先行タスクを追加します。子タスクは、指定されたすべての先行タスクが独自の実行を正常に完了した後にのみ実行されます。
タスクグラフのルートタスクが task1
であり、 task2
、 task3
、および task4
が task1
の子タスクであるとします。この例では、子タスク task5
をタスクグラフに追加し、 task2
、 task3
、および task4
を先行タスクとして指定します。
-- Create task5 and specify task2, task3, task4 as predecessors tasks.
-- The new task is a serverless task that inserts the current timestamp into a table column.
CREATE TASK task5
AFTER task2, task3, task4
AS
INSERT INTO t1(ts) VALUES(CURRENT_TIMESTAMP);
ストアドプロシージャ¶
ストアドプロシージャを呼び出す my_copy_task
という名前のタスクを作成して、1時間ごとに mytable
テーブルから名前付き mystage
ステージにデータをアンロードします( COPY INTO <場所> を使用)。
-- Create a stored procedure that unloads data from a table
-- The COPY statement in the stored procedure unloads data to files in a path identified by epoch time (using the Date.now() method)
CREATE OR REPLACE PROCEDURE my_unload_sp()
returns string not null
language javascript
AS
$$
var my_sql_command = ""
var my_sql_command = my_sql_command.concat("copy into @mystage","/",Date.now(),"/"," from mytable overwrite=true;");
var statement1 = snowflake.createStatement( {sqlText: my_sql_command} );
var result_set1 = statement1.execute();
return my_sql_command; // Statement returned for info/debug purposes
$$;
-- Create a task that calls the stored procedure every hour
CREATE TASK my_copy_task
WAREHOUSE = mywh
SCHEDULE = '60 minute'
AS
CALL my_unload_sp();
SnowSQL を使用した複数の SQL ステートメント¶
複数の SQL ステートメントを実行するタスクを作成します。この例では、タスクはセッションの TIMESTAMP_OUTPUT_FORMAT を変更してから、 CURRENT_TIMESTAMP 関数をクエリします。
注釈
タスク定義の SQL コードには、複数のステートメントが含まれています。CREATE TASK ステートメントを実行するには、一時的に SQL ステートメントの区切り文字としてセミコロン 以外 の文字を設定する必要があります。そうしないと、 CREATE TASK ステートメントはユーザーエラーを返します。SnowSQL の SQL 区切り文字を変更するコマンドは !set sql_delimiter = <文字>
です。
!set sql_delimiter=/
CREATE OR REPLACE TASK test_logging
USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = 'XSMALL'
SCHEDULE = 'USING CRON 0 * * * * America/Los_Angeles'
AS
BEGIN
ALTER SESSION SET TIMESTAMP_OUTPUT_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';
SELECT CURRENT_TIMESTAMP;
END;/
!set sql_delimiter=";"
Snowflakeスクリプトを使用した手続き型ロジック¶
変数を宣言してその変数を使用し、2分ごとに変数の値を返すタスクを作成します。
CREATE TASK t1
USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = 'XSMALL'
SCHEDULE = '2 minute'
AS
EXECUTE IMMEDIATE
$$
DECLARE
radius_of_circle float;
area_of_circle float;
BEGIN
radius_of_circle := 3;
area_of_circle := pi() * radius_of_circle * radius_of_circle;
return area_of_circle;
END;
$$;
構成付きルートタスク¶
構成を指定してその構成を読み取るタスクを作成します。
CREATE OR REPLACE TASK root_task_with_config
WAREHOUSE=mywarehouse
SCHEDULE='10 m'
CONFIG=$${"output_dir": "/temp/test_directory/", "learning_rate": 0.1}$$
AS
BEGIN
LET OUTPUT_DIR STRING := SYSTEM$GET_TASK_GRAPH_CONFIG('output_directory')::string;
LET LEARNING_RATE DECIMAL := SYSTEM$GET_TASK_GRAPH_CONFIG('learning_rate:v1')::DECIMAL;
...
END;
ファイナライザータスク¶
タスクグラフのルートタスクに関連付けられ、タスク完了後に電子メールアラートを送信するファイナライザータスクを作成します。ファイナライザータスクの詳細については、 ファイナライザータスク をご参照ください。
CREATE TASK finalize_task
WAREHOUSE = my_warehouse
FINALIZE = my_root_task
AS
CALL SYSTEM$SEND_EMAIL(
'my_email_int',
'first.last@example.com, first2.last2@example.com',
'Email Alert: Task A has finished.',
'Task A has successfully finished.\nStart Time: 10:10:32\nEnd Time: 12:15:45\nTotal Records Processed: 115678'
);