EXECUTE TASK¶
タスクに定義されたスケジュールとは関係なく、スケジュールされたタスク(スタンドアロンタスクまたは タスクグラフ にあるルートタスク)の非同期の単一実行を手動でトリガーします。
先行タスクが完了するにつれて、ルートタスクが正常に実行されると、ルートタスクが定義されたスケジュールで実行されたかのように、タスクグラフ内にある子タスクのカスケード実行がトリガーされます。
さらに、以前に失敗したタスクの再実行を手動でトリガーすることもできます。
- こちらもご参照ください。
構文¶
EXECUTE TASK <name>
EXECUTE TASK <name> RETRY LAST
パラメーター¶
name
実行するスタンドアロンタスクまたはルートタスクの識別子。識別子にスペースまたは特殊文字が含まれる場合は、文字列全体を二重引用符で囲む必要があります。二重引用符で囲まれた識別子も大文字と小文字が区別されます。
RETRY LAST
失敗した
name
の タスクグラフ の最終タスクを失敗したタスクから再実行します。タスクを再実行するには、以下の条件を満たす必要があります。
最後のタスクグラフ実行は状態が FAILED か CANCELED であること。
タスクグラフは最後に実行されてから変更されていないこと。
タスクグラフは過去14日以内に実行または再試行されていること。
タスク履歴を表示するには、 TASK_HISTORY テーブル関数または Snowsightタスク履歴 をご参照ください。
注釈
RETRY LAST は、最後に失敗したタスクから実行を開始する新しいグラフ実行を作成します。
具体的には、 FAILED または CANCELED タスクの実行はすべて直ちに再実行され、関連する子タスクは、それらの先行タスクがすべて正常に実行された場合にスケジュールされます。
さらに、再試行によって生成される新しいタスクグラフ実行は、前回失敗したグラフ実行よりも1つ大きい ATTEMPT NUMBER を持ち、再試行された、つまり元のタスクグラフ実行と同じ GRAPH_RUN_GROUP_ID を共有します。
使用上の注意¶
タスクを実行するには、タスクの OWNERSHIP または OPERATE 権限が必要です。
EXECUTE TASK コマンドがタスク実行をトリガーすると、Snowflakeは、タスクに対する OWNERSHIP 権限を持つロールが、タスクに割り当てられたウェアハウスに対する USAGE 権限、およびグローバル EXECUTE TASK 権限を持っていることを確認します。それ以外の場合は、エラーが生成されます。
OPERATE 権限を持つ別のロールが EXECUTE TASK を使用してタスクを実行する場合でも、タスクは常に元の所有者ロールの権限で実行されます。
SQL コマンドは、スタンドアロンタスクまたはタスクグラフ内のルートタスクのみを実行できます。子タスクが入力された場合、コマンドはユーザーエラーを返します。
スタンドアロンまたはルートタスクを手動で実行すると、タスクのバージョンが確立されます。スタンドアロンタスクまたはタスクグラフ全体が、このバージョンで実行を完了します。タスクバージョンの詳細については、 実行のバージョニング をご参照ください。
中断されたルートタスクは、タスクを再開 することなく 実行されます。この SQL コマンドを実行する前に、ルートタスクを明示的に再開する必要はありません。ただし、 EXECUTE TASK は、タスクグラフ内の子タスクを自動的に再開 しません。このコマンドは、中断されている子タスクをスキップします。
タスクグラフでルートタスクに関連付けられたすべての依存タスクを再帰的に再開するには、各タスクを個別に有効にするのではなく、 SYSTEM$TASK_DEPENDENTS_ENABLE 関数をクエリします(ALTER TASK ... RESUME を使用)。
新規または変更されたタスクグラフをテストする際のベストプラクティスとしては、ルートタスクを目的の運用スケジュールで実行するように設定しますが、 中断状態のままにします。タスクグラフのテストに成功した後、ルートタスクを再開します。テストのために、タスクグラフ内で中断された子タスクを再開する必要があることに注意してください。そうしないと、タスクグラフの実行中にスキップされます。
ルートタスクが現在実行中の場合(つまり、 TASK_HISTORY 出力で EXECUTING 状態)、 EXECUTE TASK コマンドは、現在の実行が完了した直後にタスクの別の実行を開始するようにスケジュールします。
ルートタスクが現在スケジュールされている場合(つまり、 TASK_HISTORY 出力の SCHEDULED 状態)、スケジュールされた実行は、現在のタイムスタンプをスケジュールされた時刻として、通常どおりリクエストされた実行に置き換えられます。ただし、スケジュールされた時間が経過した場合(ただし、タスクがまだ EXECUTING 状態に移行していない場合)、スケジュールされた実行は通常どおりに実行されます。つまり、スケジュールされた実行は、リクエストされた実行に置き換えられ ません。
ルートタスクに設定された ALLOW_OVERLAPPING_EXECUTION パラメーターは、タスクグラフの重複するインスタンスを許可するかどうかを決定します。リクエストされたタスク実行の動作は、パラメーター値によって異なります。
ALLOW_OVERLAPPING_EXECUTION = FALSE (デフォルト値)
タスクグラフのインスタンスが現在実行されていない場合、 EXECUTE TASK コマンドは、タスクグラフの別の実行をすぐに開始するようにスケジュールします。
タスクグラフ内のルートタスクまたは子タスクが現在実行中の場合(つまり、 TASK_HISTORY 出力で EXECUTING 状態)、 EXECUTE TASK コマンドは、 タスクグラフ内にある最終タスク の現在の実行が完了次第ただちに、タスクグラフの別の実行が開始されるようにスケジュールします。つまり、タスクグラフの現在のインスタンス実行は、リクエストされたタスクの開始前に完了している必要があります。
ルートタスクが現在スケジュールされている場合(つまり、 TASK_HISTORY 出力の SCHEDULED 状態)、スケジュールされた実行は、現在のタイムスタンプをスケジュールされた時刻として、リクエストされた実行に置き換えられます。ただし、スケジュールされた時間が経過した場合(しかし、タスクはまだ EXECUTING 状態に移行していない場合)、スケジュールされた実行が発生します。つまり、スケジュールされた実行は、リクエストされた実行に置き換えられ ません。
ALLOW_OVERLAPPING_EXECUTION = TRUE
タスクグラフのインスタンスが現在実行されていない場合、またはタスクグラフ内の子タスクのみがインスタンスで実行されている場合、 EXECUTE TASK コマンドは、タスクグラフの別の実行をすぐに開始するようにスケジュールします。
ルートタスクがタスクグラフのインスタンスで現在実行されている場合、 EXECUTE TASK コマンドは、 ルートタスク の現在の実行が完了した直後に開始するように、タスクグラフの別の実行をスケジュールします。
ルートタスクが、タスクツグラフのインスタンス内で現在スケジュールされている場合(つまり、 TASK_HISTORY 出力の SCHEDULED 状態)、スケジュールされた実行は、現在のタイムスタンプをスケジュールされた時刻として、通常どおりリクエストされた実行に置き換えられます。ただし、スケジュールされた時間が経過した場合(しかし、タスクはまだ EXECUTING 状態に移行していない場合)、スケジュールされた実行が発生します。つまり、スケジュールされた実行は、リクエストされた実行に置き換えられ ません。
EXECUTE TASK コマンドの呼び出しは同期的に処理されますが、タスク実行は非同期操作です。
この SQL コマンドによってトリガーされるタスク実行では、コマンドの実行時に最新であった タスクバージョン が使用されます。タスクが、コマンドの実行 後 で、実行が開始される前に変更される場合、変更は、 次の スケジュールされた実行まで適用されません。
タスクの実行中にこの SQL コマンドが複数回実行された場合、最後のコマンドを除くすべてのコマンドの実行は無視されます。次の実行が開始されると、最後の実行が行われたときに最新であったタスクバージョンが使用されます。
タスクが予期しないエラーで失敗した場合、エラーに関する通知を受け取ることができます。タスクエラー通知の構成の詳細については、 タスクのエラー通知の有効化 をご参照ください。
タスク情報を表示するには、以下のいずれかを実行します。
Snowsight を開き、 Monitoring » Task History を選択します。
COMPLETE_TASK_GRAPHS テーブル関数を呼び出し、結果を調べます。
例¶
mytask
という名前のタスクの実行を手動でトリガーします。
EXECUTE TASK mytask;