CREATE TASK¶
現在/指定されたスキーマに新しい タスク を作成するか、既存のタスクを置き換えます。
このコマンドは次のバリアントをサポートしています。
- CREATE OR ALTER TASK: タスクが存在しない場合はそれを作成し、存在する場合は既存のタスクを変更します。 
- CREATE TASK ... CLONE: 既存のタスクのクローンを作成します。 
- こちらもご参照ください。
重要
新しく作成されたタスクまたは複製されたタスクは、中断状態で作成されます。中断されたタスクの実行については、 ALTER TASK ... RESUME または EXECUTE TASK をご参照ください。
構文¶
CREATE [ OR REPLACE ] TASK [ IF NOT EXISTS ] <name>
    [ WITH TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
    [ WITH CONTACT ( <purpose> = <contact_name> [ , <purpose> = <contact_name> ... ] ) ]
    [ { WAREHOUSE = <string> }
      | { USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = <string> } ]
    [ SCHEDULE = { '<num> { HOURS | MINUTES | SECONDS }'
      | '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> ]
    [ SUCCESS_INTEGRATION = <integration_name> ]
    [ LOG_LEVEL = '<log_level>' ]
    [ COMMENT = '<string_literal>' ]
    [ FINALIZE = <string> ]
    [ TASK_AUTO_RETRY_ATTEMPTS = <num> ]
    [ USER_TASK_MINIMUM_TRIGGER_INTERVAL_IN_SECONDS = <num> ]
    [ TARGET_COMPLETION_INTERVAL = '<num> { HOURS | MINUTES | SECONDS }' ]
    [ SERVERLESS_TASK_MIN_STATEMENT_SIZE = '{ XSMALL | SMALL
      | MEDIUM | LARGE | XLARGE | XXLARGE }' ]
    [ SERVERLESS_TASK_MAX_STATEMENT_SIZE = '{ XSMALL | SMALL
      | MEDIUM | LARGE | XLARGE | XXLARGE }' ]
  [ AFTER <string> [ , <string> , ... ] ]
  [ EXECUTE AS USER <user_name> ]
  [ WHEN <boolean_expr> ]
  AS
    <sql>
バリアント構文¶
CREATE OR ALTER TASK¶
タスクがまだ存在しない場合は新しいタスクを作成するか、既存のタスクをステートメントで定義されたタスクに変換します。CREATE OR ALTER TASK ステートメントは、 CREATE TASK ステートメントの構文ルールに従い、このステートメントには ALTER TASK ステートメントと同じ制限があります。
サポートされるタスク変更には以下が含まれます。
- タスクのプロパティとパラメーターを変更します。例: SCHEDULE、 USER_TASK_TIMEOUT_MS、または COMMENT。 
- 先行タスクを設定、設定解除、または変更します。 
- タスク条件を設定、設定解除、または変更(WHEN 句)します。 
- タスク定義(AS句)を変更します。 
詳細については、 CREATE OR ALTER TASK の使用上の注意 をご参照ください。
CREATE OR ALTER TASK <name>
    [ { WAREHOUSE = <string> }
      | { USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = <string> } ]
    [ SCHEDULE = { '<num> { HOURS | MINUTES | SECONDS }'
      | 'USING CRON <expr> <time_zone>' } ]
    [ CONFIG = <configuration_string> ]
    [ ALLOW_OVERLAPPING_EXECUTION = TRUE | FALSE ]
    [ USER_TASK_TIMEOUT_MS = <num> ]
    [ <session_parameter> = <value>
      [ , <session_parameter> = <value> ... ] ]
    [ SUSPEND_TASK_AFTER_NUM_FAILURES = <num> ]
    [ ERROR_INTEGRATION = <integration_name> ]
    [ SUCCESS_INTEGRATION = <integration_name> ]
    [ COMMENT = '<string_literal>' ]
    [ FINALIZE = <string> ]
    [ TASK_AUTO_RETRY_ATTEMPTS = <num> ]
  [ 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スクリプト を使用した手続き型ロジック 
 - SQL コードは、タスク実行時に実行されます。タスクで使用する前に、 - {sql}が期待通りに実行されることを確認します。
タスクグラフ内のタスクのクローン¶
タスクグラフの場合、各依存関係タスク(つまり各子タスクやファイナライザタスク)のクローンも作成する必要がある場合があります。
タスクをクローンします(例えば、
CREATE TASK new_task_name CLONE old_task_name)。
TASK_DEPENDENTS 関数を使用して依存関係を持つタスクを検索します。例えば、次のとおりです。
SELECT * FROM TABLE(INFORMATION_SCHEMA.TASK_DEPENDENTS('old_task_name'));
依存関係タスクをクローンします(例えば、
CREATE TASK new_child_task CLONE old_child_task)。
新しいクローンタスク名を使用するように、新しい依存関係タスクを更新します(
ALTER TASK new_child_task ADD AFTER new_task_name)
オプションのパラメーター¶
CREATE OR REPLACE TASK または . CREATE TASK IF NOT EXISTS
..OR REPLACEは同じ名前の既存のタスクを置き換えます。タスクが存在しない場合、この句は無視されます。タスクを置き換えるときは、以下の動作を考慮します。
再作成されたタスクは、デフォルトで一時停止されます。
スタンドアロンまたはルートタスクが再作成されると、次にスケジュールされているタスクの実行がキャンセルされます。
CREATE OR REPLACE <オブジェクト> ステートメントはアトミックです。つまり、オブジェクトが置き換えられると、単一のトランザクションで、古いオブジェクトが削除されて新しいオブジェクトが作成されます。
定義が大きいタスクはエラーの原因になります。タスクのサイズが原因でエラーが発生する場合は、ストアドプロシージャを使用するか、タスクの定義を単純化します。
タスクを置き換えると、実行中のタスクはすべて完了します。
CREATE OR REPLACE TASK で置き換える前に進行中のタスクの実行を停止するには、 SYSTEM$USER_TASK_CANCEL_ONGOING_EXECUTIONS 関数を使用します。
実行中のタスクを停止するには、 CREATE OR REPLACE TASK で置き換えてください。
実行中のクエリ ID を検索します。例は次のとおりです。
select name, query_id, state, scheduled_time, error_message from table(information_schema.task_history(task_name => 'my_task'));
クエリをキャンセルするには、 SYSTEM$CANCEL_QUERY 関数を使用して、クエリ ID を指定します。例は次のとおりです。
select system$cancel_query('query_id');
キャンセルが完了するまで数秒間タスクの実行をモニターします。例は次のとおりです。
select name, query_id, state, scheduled_time, error_message from table(information_schema.task_history(task_name => 'my_task'));
...IF NOT EXISTSは同じ名前のタスクがまだ存在しない場合にのみ新しいタスクを作成します。タスクが既に存在する場合、この句は無視されます。注釈
CREATE OR REPLACEとCREATE IF NOT EXISTS句は互いに排他的です。両方を同じステートメントで使うことはできません。
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ユーティリティ構文のサブセットをサポートします。 
 - 'expr': 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か月後)に実行されるようにスケジュールされては いません。
 - タイミングの例: - SCHEDULE 値 - 説明 - * * * * * UTC- 毎分。UTC タイムゾーン。 - 0/5 * * * * UTC- 毎時ちょうどから5分ごと。UTC タイムゾーン。 - 5 * * * * UTC- 毎時5分。UTC タイムゾーン。 - 30 3 * * * UTC- 毎日午前3時30分UTC タイムゾーン。 - 0 6,18 * * * UTC- 1日2回、UTC タイムゾーンで午前6時と午後6時。 - 0 3 * * MON-FRI UTC- 平日午前3時UTC タイムゾーン。 - 0 0 1 * * UTC- 毎月1日午前0時。UTC タイムゾーン。 - 0 0 L * * UTC- 毎月末日午前0時。UTC タイムゾーン。 
 - 注釈 - cron式は、タスクのすべての 有効 実行時間を定義します。Snowflakeは、このスケジュールに基づいてタスクを実行しようとします。ただし、次の有効な実行時間が始まる前に前の実行が完了していない場合、有効な実行時間はスキップされます。 
- 特定の月と曜日の両方がcron式に含まれている場合、タスクは月または曜日の いずれか を満たす日にスケジュールされます。例えば、 - SCHEDULE = 'USING CRON 0 0 10-20 * TUE,THU UTC'は、毎月10日から20日の深夜にタスクをスケジュールし、その日以外の火曜日または木曜日にもタスクをスケジュールします。
- cronでの時間の最小粒度は分です。タスクの実行間隔を短く設定するには、代わりに - SCHEDULE = ' <num> SECONDS'パラメーターを使います。例えば、- SCHEDULE = '10 SECONDS'は10秒ごとにタスクを実行します。
- cron式で定義された分の間にタスクが再開された場合、最初にスケジュールされたタスクの実行は、cron式のインスタンスの次回発生です。たとえば、毎日午前0時( - USING CRON 0 0 * * *)に実行するようにスケジュールされたタスクが、午前0時+5秒(- 00:00:05)に再開される場合、最初のタスクの実行は次の午前0時にスケジュールされます。
 - 'time_zone': タスクのcronタイムゾーン。タイムゾーンは文字列リテラルで指定します。タイムゾーンのリストについては、 tzデータベースタイムゾーンのリスト (Wikipedia)をご参照ください。例:- SCHEDULE 値 - 説明 - 0 3 * * * America/Los_Angeles- 毎晩午前3時、太平洋標準時/太平洋夏時間(PST/PDT)タイムゾーン - 注釈 - cron式は現在、指定されたタイムゾーンに対してのみ評価します。アカウントの TIMEZONE パラメーター値を変更(またはユーザーレベルまたはセッションレベルで値を設定)しても、タスクのタイムゾーンは 変更されません 。 
- 夏時間を採用しているタイムゾーンでは、夏時間移行時にスケジュールされたタスクが予期しない動作をすることがあります。例: 
- 夏時間から標準時への変更中、アメリカ/ロサンゼルスのタイムゾーン( - 0 1 * * * America/Los_Angeles)で午前1時に開始するようスケジュールされたタスクは、2回実行されます。午前1時に実行され、午前1時59分59秒が現地時間の午前1時00分00秒に移行するときに再度実行されます。
- 標準時から夏時間への変更中、アメリカ/ロサンゼルスのタイムゾーン( - 0 2 * * * America/Los_Angeles)で午前2:00に開始するようスケジュールされたタスクは、現地時間が午前1時59分59秒から午前3時にシフトするため、実行されません。
 - 夏時間による予期しないタスクの実行を避けるため、次を検討します。 - 午前1時から午前2時59分の間に開始するタスクはスケジュールしないでください 
- 毎年2回、午前1時から午前3時の間にスケジュールされたタスクのCRON式を手動で調整し、時間の変更に対応します。 
- UTC など、夏時間を適用しない時間形式を使用してください。タスクのタイムゾーンを変更 しないでください。 
 
 
 - 'num { HOURS | MINUTES | SECONDS }'
- タスクの実行間の待機時間の間隔を指定します。 - Snowflakeは、タスクが再開されたとき(ALTER TASK ... RESUME)または異なる間隔が設定されたとき(ALTERTASK ... SET SCHEDULE)に、ベース間隔の時間を設定します。 - 例えば、 - 10 MINUTESの INTERVAL 値が設定され、タスクが午前9時3分に有効になると、タスクは午前9時13分、午前9時23分といった具合に実行されます。- Snowflakeは、タスクが設定間隔より前に実行されないことを保証します。しかし、Snowflakeは指定された間隔で正確にタスクが実行されることを保証することはできません。 - 値: - { 10 - 691200 } SECONDS、- { 1 - 11520 } MINUTES、 または- { 1-192 } HOURS(つまり、10秒から8日間に相当する時間まで)。正の整数のみを受け入れます。- 表記もサポートしています: HOUR、 MINUTE、 SECOND、およびH、M、Sの表記にも対応しています。 
 
 
- CONFIG = configuration_string
- タスクグラフ内のすべてのタスクによりアクセス可能なキーと値のペアを文字列で指定します。JSON 形式にする必要があります。現在実行中のタスクの構成文字列の取得の詳細については、 SYSTEM$GET_TASK_GRAPH_CONFIG をご参照ください。 - 注釈 - このパラメーターは、ルートタスクでのみ設定できます。この設定は、タスクグラフ内のすべてのタスクに適用されます。 - このパラメーターはスタンドアロンタスクに設定できますが、タスクの動作には影響しません。Snowflakeは、スタンドアロンタスクの1つのインスタンスのみが特定の時間に実行されていることを確認します。 
- ALLOW_OVERLAPPING_EXECUTION = TRUE | FALSE
- タスクグラフの複数のインスタンスを同時に実行できるようにするかどうかを指定します。 - 注釈 - このパラメーターは、ルートタスクでのみ設定できます。この設定は、タスクグラフ内のすべてのタスクに適用されます。 - このパラメーターはスタンドアロンタスクに設定できますが、タスクの動作には影響しません。Snowflakeは、スタンドアロンタスクの1つのインスタンスのみが特定の時間に実行されていることを確認します。 - TRUEの場合、子タスクの現在の実行がまだ動作している間にルートタスクの次のスケジュールが実行されると、タスクグラフの別のインスタンスが開始されます。次の実行スケジュールが開始する際に、ルートタスクがまだ実行されている場合、そのスケジュールされた時間はスキップされます。
- FALSEの場合、ルートタスクの次の実行は、タスクグラフ内にあるすべての子タスクの実行が終了した後にのみスケジュールされます。これは、タスクグラフ内のすべてのタスクを実行するために必要な累積時間がルートタスクの定義で設定された、明示的にスケジュールされた時間を超える場合、タスクグラフの少なくとも1つの実行がスキップされることを意味します。
 - デフォルト: - FALSE
- session_parameter = value [ , session_parameter = value ... ]
- タスクの実行時にセッションに設定するセッションパラメーターのコンマ区切りリストを指定します。タスクはすべてのセッションパラメーターをサポートします。完全なリストについては、 セッションパラメーター をご参照ください。 
- USER_TASK_TIMEOUT_MS = num
- タスクがタイムアウトするまでの1回の実行の制限時間(ミリ秒単位)を指定します。 - 注釈 - タスクの制限時間を大幅に増やす前に、タスクによって開始された SQL ステートメントを最適化できるか(ステートメントを書き換えるか、ストアドプロシージャを使用して)、ウェアハウスのサイズを増やす必要があるかどうかを検討してください。 
- STATEMENT_TIMEOUT_IN_SECONDS と USER_TASK_TIMEOUT_MS の両方が設定されている場合、タイムアウトは2つのパラメーターのうち、 低い方 のゼロ以外の値となります。 
- STATEMENT_QUEUED_TIMEOUT_IN_SECONDS と USER_TASK_TIMEOUT_MS の両方が設定されている場合、 USER_TASK_TIMEOUT_MS の値が優先されます。 
 - このパラメーターの詳細については、 USER_TASK_TIMEOUT_MS をご参照ください。 - 値: - 0~- 604800000(7日間)。値- 0は、最大タイムアウト値が強制されることを指定します。- デフォルト: - 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との通信に使用する通知統合の名前を指定します。詳細については、 タスクの通知の有効化 をご参照ください。 
- SUCCESS_INTEGRATION = 'integration_name'
- Amazon Simple Notification Service(SNS)、Microsoft Azure Event Grid、Google Pub/Subを使用して成功通知を送信するタスクを構成する場合にのみ必要です。 - Amazon SNS、 MS Azure Event Grid、またはGoogle Pub/Subとの通信に使用する通知統合の名前を指定します。詳細については、 タスクの通知の有効化 をご参照ください。 
- LOG_LEVEL = 'log_level'
- 取り込まれて、アクティブなイベントテーブルで利用可能になる このタスクのイベント の重大度レベルを指定します。指定されたレベルのイベント(およびより厳しいレベルのイベント)がインジェストされます。 - レベルの詳細については、 LOG_LEVEL をご参照ください。ログレベルの設定については、 ロギング、メトリクス、トレースのレベル設定 をご参照ください。 
- 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 などの ブーリアン演算子。 - 2つのストリームのどちらかでデータが変更されるたびに実行される簡単な例です。 - CREATE TASK my_task WAREHOUSE = my_warehouse WHEN SYSTEM$STREAM_HAS_DATA('my_customer_stream') OR SYSTEM$STREAM_HAS_DATA('my_order_stream') AS SELECT CURRENT_TIMESTAMP; 
- 数値型、文字列型、ブール型の間でキャストします。 
- 等しい、等しくない、より大きい、より小さいなどの 比較演算子。 
 - WHEN 式の条件の検証にコンピューティングリソースは必要ありません。代わりに、検証はクラウドサービスレイヤーで処理されます。タスクが WHEN 条件を評価して実行しないたびに、わずかな料金が発生します。タスクが実行されるまで、タスクがトリガーされるたびに料金が累積されます。その時点で、料金はSnowflakeクレジットに変換され、タスク実行のコンピューティングリソース使用量に追加されます。 - 一般に、条件を検証するための計算時間は、タスクの実行時間と比較して重要ではありません。ベストプラクティスとして、スケジュールされたタスクと実際のタスクの実行を可能な限り一致させます。タスクの実行と一致しないタスクのスケジュールは避けます。たとえば、データがおよそ24時間ごとにストリームのあるテーブルに挿入される場合、毎分ストリームデータをチェックするタスクはスケジュールしないでください。各実行で WHEN 式を検証するための料金は、通常は重要ではありませんが、料金は累積されます。 - コンピューティングリソース1日あたりの使用量の10%クォータ を下回るクラウドサービス1日あたりの消費量は、クラウドサービスの料金に累積されません。 
- TAG ( tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] )
- タグ の名前とタグ文字列の値を指定します。 - タグ値は常に文字列であり、タグ値の最大文字数は256です。 - ステートメントでのタグの指定に関する情報については、 オブジェクトのタグクォータ をご参照ください。 - このパラメーターは、 CREATE OR ALTER バリアント構文ではサポートされていません。 
- WITH CONTACT ( purpose = contact [ , purpose = contact ...] )
- 新しいオブジェクトを1つ以上の 連絡先 に関連付けます。 
- FINALIZE = string
- ファイナライザータスクが関連付けられているルートタスクの名前を指定します。ファイナライザータスクは、タスクグラフ内にある他のすべてのタスク実行が完了した後に実行されます。タスクグラフが使用する通知やリソースのリリースとクリーンアップを処理するファイナライザータスクの SQL を定義できます。詳細については、 ファイナライザタスク をご参照ください。 - ルートタスクにはファイナライザタスクを1つのみ指定できます。ルートタスクに対して複数のファイナライザタスクを作成すると、タスクの作成に失敗します。 
- ファイナライザタスクには子タスクを指定できません。ファイナライザタスクを先行タスクにしようとするコマンドは失敗します。 
- ファイナライザタスクにはスケジュールを指定できません。スケジュール付きファイナライザタスクの作成は失敗します。 
 - デフォルト: 値なし 
- TASK_AUTO_RETRY_ATTEMPTS = num
- タスクグラフの自動再試行回数を指定します。タスクグラフが FAILED の状態で完了した場合、Snowflakeは自動的に失敗したグラフの最後のタスクからタスクグラフを再試行することができます。 - タスクグラフの自動再試行はデフォルトでは無効になっています。この機能を有効にするには、タスクグラフのルートタスクで TASK_AUTO_RETRY_ATTEMPTS を - 0より大きい値に設定します。- このパラメーターは、タスクグラフのルートタスクに設定する必要があることに注意してください。子タスクに設定されている場合は、エラーが返されます。 - 値: - 0~- 30- デフォルト: - 0
- USER_TASK_MINIMUM_TRIGGER_INTERVAL_IN_SECONDS = num
- タスクの実行頻度を秒単位で定義します。データの変更が指定された最小値よりも頻繁に発生する場合、変更はグループ化され、まとめて処理されます。 - この値を12時間以上に設定しても、タスクは12時間ごとに実行されます。 - 値: 最小値 - 10、最大値- 604800。- デフォルト: - 30
- TARGET_COMPLETION_INTERVAL = 'num { HOURS | MINUTES | SECONDS }'
- タスクの完了時間を指定します。このパラメーターはサーバーレスタスクにのみ適用されます。このプロパティはタスクにのみ設定されます。 - このパラメーターはサーバーレス トリガーされるタスク を作成する際に必要です。 - 値: - { 10 - 86400 } SECONDS、- { 1 - 1440 } MINUTES、 または- { 1-24 } HOURS(つまり、10秒から1日に相当する時間まで)。正の整数のみを受け入れます。- 表記もサポートしています: HOUR、 MINUTE、 SECOND、およびH、M、Sの表記にも対応しています。 - デフォルト:Snowflakeはサーバーレスのコンピューティングリソースのサイズを変更し、次のスケジュール実行時間までに完了するようにします。 
- SERVERLESS_TASK_MIN_STATEMENT_SIZE = string
- サーバーレスタスクで許容される最小ウェアハウスサイズを指定します。このパラメーターはサーバーレスタスクにのみ適用されます。このパラメーターはタスク、スキーマ、データベース、アカウントで指定できます。優先順位は標準のパラメーター階層に従います。 - 値: 最小値 - XSMALL、最大値- XXLARGE。値は WAREHOUSE_SIZE 値 と一致します。- X2LARGE という表記もサポートしています。 - デフォルト: - XSMALL- SERVERLESS_TASK_MIN_STATEMENT_SIZE と USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE の両方が指定されている場合、 SERVERLESS_TASK_MIN_STATEMENT_SIZE は USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE 以下にする必要があることに注意してください。 
- SERVERLESS_TASK_MAX_STATEMENT_SIZE = string
- サーバーレスタスクに許可される最大ウェアハウスサイズを指定します。このパラメーターはサーバーレスタスクにのみ適用されます。このパラメーターはタスク、スキーマ、データベース、アカウントで指定できます。優先順位は標準のパラメーター階層に従います。 - 値: 最小値 - XSMALL、最大値- XXLARGE。- X2LARGE という表記もサポートしています。 - デフォルト: - XXLARGE- SERVERLESS_TASK_MIN_STATEMENT_SIZE および SERVERLESS_TASK_MAX_STATEMENT_SIZE の両方とも指定されている場合は、SERVERLESS_TASK_MIN_STATEMENT_SIZE は SERVERLESS_TASK_MAX_STATEMENT_SIZE 以下である必要があります。SERVERLESS_TASK_MAX_STATEMENT_SIZE は USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE 以上である必要があります 
- EXECUTE AS USER <user_name>
- 指定されたユーザーアカウントに代わってタスクを実行します。コマンドを実行するユーザーは、GRANTIMPERSONATEONUSERTOROLE コマンドを使用して付与された権限を持っている必要があります。 - 詳細については、 ユーザー権限でタスクを実行する をご参照ください。 
アクセス制御の要件¶
この操作の実行に使用される ロール には、少なくとも次の 権限 が必要です。
| 権限 | オブジェクト | 注意 | 
|---|---|---|
| EXECUTE TASK | アカウント | ロールが所有するタスクを実行するために必要です。ロールの EXECUTE TASK 権限を取り消すと、それ以降、すべてのタスクの実行はそのロールで開始できなくなります。 | 
| EXECUTE MANAGED TASK | アカウント | 実行でサーバーレスコンピューティングリソースに依存するタスクにのみ必要です。 | 
| CREATE TASK | スキーマ | |
| USAGE | ウェアハウス | 実行のためにユーザー管理のウェアハウスに依存するタスクにのみ必要です。 | 
| OWNERSHIP | タスク | 既存 のタスクに対して CREATE OR ALTER TASK ステートメントを実行するときに必要です。 OWNERSHIP is a special privilege on an object that is automatically granted to the role that created the object, but can also be transferred using the GRANT OWNERSHIP command to a different role by the owning role (or any role with the MANAGE GRANTS privilege). | 
スキーマ内のオブジェクトに対して操作を実行するには、親データベースとスキーマに対する USAGE 権限が必要です。スキーマに対する 任意の権限を付与されたロールは、そのロールがスキーマを解決できることに注意してください。たとえば、スキーマに対するCREATE権限を付与されたロールは、そのスキーマにオブジェクトを作成できますが、そのスキーマに対するUSAGE*も*付与されている必要はありません。
指定された権限のセットを使用してカスタムロールを作成する手順については、 カスタムロールの作成 をご参照ください。
セキュリティ保護可能なオブジェクト に対して SQL アクションを実行するためのロールと権限付与に関する一般的な情報については、 アクセス制御の概要 をご参照ください。
使用上の注意¶
- タスクは、タスク所有者の権限を使用して実行されます。タスクを実行するために最低限必要な権限のリストについては、 タスクセキュリティ をご参照ください。 - ロールをタスク定義に含める 前に、タスク所有者ロールとして SQL ステートメントを実行するか、ストアドプロシージャを呼び出し、SQL またはストアドプロシージャによって参照されるオブジェクトに対する必要な権限がロールにあることを確認します。 
- サーバーレスタスクの場合、 - タスクのサーバーレスコンピューティングリソースは、ウェアハウスサイズで - XSMALLから- XXLARGEに相当する範囲になります。サイズアップのご依頼は、 Snowflakeサポート にご連絡ください。
- タスクグラフ内にある個々のタスクは、サーバーレスまたはユーザー管理のコンピューティングリソースを使用できます。タスクグラフ内にある すべて のタスクに対してこのサーバーレスコンピューティングを使用する必要はありません。 
 
- タスクが予期しないエラーで失敗した場合、エラーに関する通知を受け取ることができます。タスクエラー通知の構成の詳細については、 タスクの通知の有効化 をご参照ください。 
- デフォルトでは、トランザクションを明示的に開始せずに実行された DML ステートメントは、成功時には自動的にコミットされ、失敗時にはステートメントの最後でロールバックされます。この動作は 自動コミット と呼ばれ、 AUTOCOMMIT パラメーターで制御されます。このパラメーターは TRUE に設定する 必要があります。アカウントレベルで AUTOCOMMIT パラメーターが FALSE に設定されている場合、個々のタスクのパラメーターを TRUE に設定します( ALTER TASK ... SET AUTOCOMMIT = TRUEを使用)。それ以外では、タスクによって実行されるどのような DML ステートメントも失敗します。 
- ストリームからデータを消費するタスクは1つのみにする必要があります。同じテーブルに対して複数のストリームを作成し、複数のタスクに消費させます。タスクが DML ステートメントを使用してストリーム内のデータを消費すると、ストリームはオフセットを進め、次のタスクで変更データを消費することができなくなります。 
- メタデータについて: - 注意 - Snowflakeサービスを使用する場合、お客様は、個人データ(ユーザーオブジェクト向け以外)、機密データ、輸出管理データ、またはその他の規制されたデータがメタデータとして入力されていないことを確認する必要があります。詳細については、 Snowflakeのメタデータフィールド をご参照ください。 
CREATE OR ALTER TASK の使用上の注意¶
- ALTER TASK コマンドのすべての制限が適用されます。 
- CREATE OR ALTER TASK コマンドを使用してタスクを再開または中断することはできません。タスクを再開または中断するには、 ALTER TASK コマンドを使用します。 
- タグの設定や設定解除はサポートされていませんが、既存のタグは CREATE OR ALTER ステートメントによって変更されることは なく、そのまま残ります。 
例¶
単一の SQL ステートメント¶
日曜日の午前9時から午後5時まで、1時間ごとに現在のタイムスタンプをクエリするサーバーレスタスクを作成します(America/Los_Angelesタイムゾーン)。
初期のウェアハウスサイズは 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;
1時間ごとに現在のタイムスタンプをテーブルに挿入するサーバーレスタスクを作成します。タスクは、タスクが実行されるセッションの TIMESTAMP_INPUT_FORMAT パラメーターを設定します。このセッションパラメーターは、挿入されたタイムスタンプの形式を指定します。
CREATE TASK t1
  SCHEDULE = '60 MINUTES'
  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 MINUTES'
  AS
    INSERT INTO mytable(ts) VALUES(CURRENT_TIMESTAMP);
5分ごとに、ストリームから INSERT 操作の変更追跡データをテーブルに挿入するタスクを作成します。タスクは SYSTEM$STREAM_HAS_DATA 関数を使用してストリームをポーリングし、変更データが存在するかどうかを判断し、結果が FALSE の場合、現在の実行をスキップします。
CREATE TASK mytask1
  WAREHOUSE = mywh
  SCHEDULE = '5 MINUTES'
  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 MINUTES'
  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スクリプトを使用した手続き型ロジック¶
変数を宣言し、その変数を使用し、15秒ごとに変数の値を返すタスクを作成します。
CREATE TASK t1
  USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = 'XSMALL'
  SCHEDULE = '15 SECONDS'
  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_dir')::string;
      LET LEARNING_RATE DECIMAL := SYSTEM$GET_TASK_GRAPH_CONFIG('learning_rate')::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'
    );
トリガーされるタスク¶
ストリームに関連付けられたトリガーされるタスクを作成し、ストリームに新しいデータがあるたびに、指定されたストリームからテーブルにデータを挿入します。詳細については、 トリガーされるタスク をご参照ください。
CREATE TASK triggeredTask
  WAREHOUSE = my_warehouse
  WHEN system$stream_has_data('my_stream')
  AS
    INSERT INTO my_downstream_table
    SELECT * FROM my_stream;
ALTER TASK triggeredTask RESUME;
CREATE OR ALTER TASK コマンドを使った簡単なタスクを作成、変更する¶
ウェアハウス my_warehouse で毎時実行するタスク my_task を作成します。
CREATE OR ALTER TASK my_task
  WAREHOUSE = my_warehouse
  SCHEDULE = '60 MINUTES'
  AS
    SELECT PI();
タスク my_other_task の後にタスク my_task を実行するように変更し、タスクの定義を更新します。
CREATE OR ALTER TASK my_task
  WAREHOUSE = regress
  AFTER my_other_task
  AS
    SELECT 2 * PI();