雪花:在预定时间之外启动任务

时间:2019-12-20 19:34:36

标签: snowflake-data-warehouse

我创建了一个任务:

CREATE OR REPLACE TASK TASK_1

    WAREHOUSE = WAREHOUSE
    SCHEDULE = 'USING CRON 30 1 * * * America/Detroit'
    AS
....

每天运行1:30。 有没有一种方法可以按需执行此查询? 即:

TRIGGER TASK TASK_1;

2 个答案:

答案 0 :(得分:0)

当前,无法在时间表或任务依赖项之外明确执行任务。

答案 1 :(得分:0)

mRainey的答案是正确的。您不能在计划或任务依赖项之外计划任务。那是对OP问题的正确答案。

对于其他偶然发现此答案的人来说,您可以自己在其他时间安排任务变得容易:

CREATE OR REPLACE PROCEDURE "SCHEDULE_TASK_AT_TIME"(TASK_NAME VARCHAR, HOUR float, MINUTE float)
RETURNS VARIANT
LANGUAGE JAVASCRIPT

    AS $$

    var return_rows = [];

    var task_name = TASK_NAME;
    var h = HOUR;
    var m = MINUTE;

    var default_timezone = 'America/Los_Angeles';

    var new_chron = 'USING CRON ' + m +  ' ' + h + ' * * * ' + default_timezone;

    var stmt = snowflake.createStatement({sqlText: `
        DESCRIBE TASK IDENTIFIER(:1)
    `, binds:[task_name]});
    res = stmt.execute();

    res.next();
    var old_chron = res.getColumnValue(8);

    var stmt = snowflake.createStatement({sqlText: `
        ALTER TASK IDENTIFIER(:1) SUSPEND
    `, binds:[task_name]});
    res = stmt.execute();  

    var stmt = snowflake.createStatement({sqlText: `
        ALTER TASK IDENTIFIER(:1) SET SCHEDULE = :2
    `, binds:[task_name, new_chron]});
    res = stmt.execute();   

    var stmt = snowflake.createStatement({sqlText: `
        ALTER TASK IDENTIFIER(:1) RESUME
    `, binds:[task_name]});
    res = stmt.execute();  


    return_rows.push('Old Chron: ' + old_chron);
    return_rows.push('New Chron: ' + new_chron);

    return return_rows;

    $$;

然后,您可以像这样安排任务,该任务将在下一个22:38运行:

call SCHEDULE_TASK_AT_TIME('DEMO_TASK', 22, 38);

此过程的输出为您提供了旧的时钟时间和新的时钟时间,因此您可以在完成后轻松地将其重新设置。

请务必注意此操作并注意其局限性-在我的版本中,您必须对时区进行硬编码。

此外,我也没有考虑您是否可以将时钟设置为仅执行一次,因此无论您将小时和分钟设置为什么时间,除非您采取进一步的措施,否则它每天都会像这样运行。