Snowflake Как возобновить корневую задачу после ее приостановки?

#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 приостановить;’