#sql #triggers #task #scheduled-tasks #snowflake-cloud-data-platform
#sql #триггеры #задача #запланированные задачи #snowflake-cloud-data-platform
Вопрос:
У меня есть следующая корневая и дочерняя задача. Все работает так, как задумано, но как я могу автоматически TSK_ROOT
возобновить работу после ее приостановки? Должен ли я создавать другую задачу, которая проверяет TSK_ROOT
, приостановлена ли она? Разве это не противоречит цели корневой задачи?
CREATE OR REPLACE TASK TSK_ROOT
WAREHOUSE = MYWH
SCHEDULE = '5 MINUTE'
WHEN
SYSTEM$STREAM_HAS_DATA('<stream_name>')
AS
ALTER TASK TSK_ROOT SUSPEND;
CREATE OR REPLACE TASK TKS_ONE
WAREHOUSE = MYWH
AFTER TSK_ROOT
AS
....
Комментарии:
1. Почему задача приостанавливается в этом коде?
2.
AFTER TSK_ROOT
это условие для дочерних задач, которые у меня есть. Дочерняя задача будет выполняться послеTSK_ROOT
приостановки.
Ответ №1:
Что я понимаю из комментариев:
TKS_ONE
выполняется после выполненияTSK_ROOT
.- Вопрос предполагает, что
TKS_ONE
выполняется только послеTSK_ROOT
приостановки, следовательноTSK_ROOT
, включает код для приостановки самого себя. - Это не обязательно так.
TSK_ROOT
может запускать что угодно,select 1 x
например, иTKS_ONE
будет выполняться независимо.
Поэтому, чтобы избежать приостановки TSK_ROOT
, просто не приостанавливайте ее изнутри TSK_ROOT
.
Проверьте этот пример:
Комментарии:
1. Таким
AFTER
образом, условие не зависит от приостановки корневой задачи? Из чтения документации «Указывает задачу-предшественницу для текущей задачи. Когда запуск предыдущей задачи завершается успешно, она запускает эту задачу (после кратковременной задержки). »2. Точно. По
SELECT 1
завершении будет запущена вторая задача. Нет необходимостиsuspend
finish
Ответ №2:
Приостановка / возобновление следует использовать для включения (возобновления) или выключения (приостановки) для обслуживания кода, а не в качестве операционной функции.
может быть, попробовать что-то вроде
SCHEDULE = ‘ИСПОЛЬЗОВАНИЕ CRON */5 9 * * * PST8PDT’
поскольку у вас есть СИСТЕМНЫЙ $STREAM_HAS_DATA(‘<имя_потока>’) в вашем предложении when, он не возобновит ваш склад / использование кредитов, если поток пуст.
Если это теоретический, а не оперативный вопрос:
Для любой цепочки задач с расписанием и следующими задачами в последовательности следующим образом
Root (по расписанию) —task1 (после root) —task2 (после task1) —task3 (после task2)
‘suspend’ должен применяться слева, а ‘resume’ — справа. последовательность может быть такой
resumed -- suspended -- resumed -- suspended
но на практике это всегда должно выглядеть как одно из этих
resumed -- resumed -- resumed -- resumed
suspended -- resumed -- resumed -- resumed
suspended -- suspended -- resumed -- resumed
suspended -- suspended -- suspended -- resumed
suspended -- suspended -- suspended -- suspended
итак, в этом случае, если ваша оперантная цель — запустить task1 один раз.
попросите root выполнить оператор do nothing, например select current_date;
Сделайте то, что вы должны, с task1, а затем попросите task2 ‘alter task root приостановить;’