You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Snowflake数据仓库中基于父任务状态设置子任务启停条件

Snowflake任务树:基于父任务状态控制子任务执行

核心解决思路

Snowflake的任务WHEN子句支持通过查询任务历史视图TASK_HISTORY判断父任务的执行状态,以此控制子任务是否触发。以下是针对不同父任务状态场景的具体配置方案:

1. 修正示例中的基础错误

你提供的示例存在两个关键问题:

  • 两个任务使用相同名称DATA_IMPORT,会导致覆盖,需为子任务指定唯一名称
  • 使用了中文单引号‘’,Snowflake要求使用英文单引号''

2. 按父任务状态配置子任务

场景1:子任务仅在父任务成功时执行

通过TASK_HISTORY查询父任务最新执行状态为SUCCEEDED:

-- 创建父任务
CREATE OR REPLACE TASK DATA_IMPORT
WAREHOUSE = COMPUTE_WH
SCHEDULE = '60 MINUTE'
AS
INSERT INTO CUSTOMERS2 SELECT * FROM CUSTOMERS;

-- 创建子任务:仅父任务成功时执行
CREATE OR REPLACE TASK POST_PROCESS_TASK
WAREHOUSE = COMPUTE_WH
WHEN (
  SELECT STATE
  FROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(
    TASK_NAME => 'DATA_IMPORT',
    SCHEDULED_TIME_RANGE_START => DATEADD('minute', -60, CURRENT_TIMESTAMP())
  ))
  ORDER BY SCHEDULED_TIME DESC
  LIMIT 1
) = 'SUCCEEDED'
AFTER DATA_IMPORT
AS
CALL POST_PROCESS_STORED_PROCEDURE();

-- 启用任务(默认创建后为暂停状态)
ALTER TASK DATA_IMPORT RESUME;
ALTER TASK POST_PROCESS_TASK RESUME;

场景2:子任务在父任务失败时执行

修改WHEN子句的状态判断为FAILED:

CREATE OR REPLACE TASK FAILURE_HANDLER_TASK
WAREHOUSE = COMPUTE_WH
WHEN (
  SELECT STATE
  FROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(
    TASK_NAME => 'DATA_IMPORT',
    SCHEDULED_TIME_RANGE_START => DATEADD('minute', -60, CURRENT_TIMESTAMP())
  ))
  ORDER BY SCHEDULED_TIME DESC
  LIMIT 1
) = 'FAILED'
AFTER DATA_IMPORT
AS
CALL FAILURE_NOTIFICATION_PROCEDURE();

ALTER TASK FAILURE_HANDLER_TASK RESUME;

场景3:子任务在父任务有警告但成功时执行

通过WARNING_COUNT字段判断父任务执行时有警告但状态为成功:

CREATE OR REPLACE TASK WARNING_HANDLER_TASK
WAREHOUSE = COMPUTE_WH
WHEN (
  SELECT 
    STATE = 'SUCCEEDED' AND WARNING_COUNT > 0
  FROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(
    TASK_NAME => 'DATA_IMPORT',
    SCHEDULED_TIME_RANGE_START => DATEADD('minute', -60, CURRENT_TIMESTAMP())
  ))
  ORDER BY SCHEDULED_TIME DESC
  LIMIT 1
)
AFTER DATA_IMPORT
AS
CALL WARNING_REVIEW_PROCEDURE();

ALTER TASK WARNING_HANDLER_TASK RESUME;

注意事项

  • TASK_HISTORY查询需用SCHEDULED_TIME_RANGE_START限定时间范围,避免全表扫描影响性能
  • 任务创建后默认处于暂停状态,必须通过ALTER TASK ... RESUME启用
  • 若父任务未执行过(无历史记录),子任务的WHEN条件返回NULL,子任务不会触发
  • 任务树层级依赖需确保父/子任务在同一数据库/schema下,或指定完整名称

内容的提问来源于stack exchange,提问作者Vijay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 22:42:21