Snowflake 任务 DDL

2025年7月29日 | 阅读13分钟

引言

Snowflake 提供了一组数据定义语言 (DDL) 命令来管理平台内的任务。这些命令包括用于创建新任务的 CREATE TASK、用于修改现有任务的 ALTER TASK、用于删除任务的 DROP TASK 以及用于查看任务详细信息的 DESCRIBE TASK。

此外,SHOW TASKS 允许用户列出和查看数据库或 模式中的任务。每个命令在任务管理中都发挥着特定功能,使用户能够有效地创建、修改、执行、监控和删除任务。执行这些命令需要适当的权限,例如 USAGE、OPERATE、OWNERSHIP 和 MONITOR,以确保任务的安全和受控管理。

CREATE TASK

语法

  • IF NOT EXISTS: 仅当不存在同名任务时才创建该任务。
  • WAREHOUSE: 指定用于执行任务的仓库。
  • SCHEDULE: 使用 cron 表达式定义计划,或在另一任务完成后触发该任务。
  • USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE: 指定在未指定仓库时自动创建的托管仓库的大小。
  • ALLOW_OVERLAPPING_EXECUTION: 允许或禁止任务的多个实例同时运行。
  • COMMENT: 添加关于任务的描述或注释。
  • AS: 包含任务将执行的 SQL 语句。

变体语法

CREATE OR ALTER TASK

CREATE OR ALTER TASK 命令是一种方便的方式,可以创建新任务或修改现有任务(如果它已存在)。这避免了在尝试创建或修改任务之前显式检查任务是否存在的需要。

语法

CREATE TASK … CLONE

CREATE TASK CLONE 命令用于通过克隆现有任务来创建新任务。这包括复制所有任务属性,例如计划、仓库和 SQL 语句,除非另有明确覆盖。

语法

注意:当您使用 CREATE TASK <new_task_name> CLONE <existing_task_name>; 克隆任务时,原始任务的所有属性都会复制到新任务中。但是,您可以在克隆过程中覆盖特定属性。

示例

必需参数

  • 任务名称: 要创建的任务的名称。这是一个必填字段。
  • SQL 语句: 任务将执行的 SQL 语句。这是必需的,它定义了任务的主要功能。

可选参数

  • WAREHOUSE: 指定任务将使用的计算仓库。
  • SCHEDULE: 使用 cron 表达式定义执行计划,或指定一个前置任务。
  • USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE: 设置托管仓库的大小(如果适用)。
  • ALLOW_OVERLAPPING_EXECUTION: 确定任务的多个实例是否可以并发执行。
  • COMMENT: 向任务添加注释或描述。

访问控制要求

要在 Snowflake 中创建、修改或管理任务,执行 SQL 命令的角色必须具有以下权限

权限Object注意事项
USAGE仓库指定任务仓库所需的权限。
OPERATE仓库执行使用指定仓库的任务所需的权限。
OWNERSHIPCREATE TASK模式在模式中创建任务所需的权限。
MONITOR账户允许跨帐户监控任务执行。

其他说明

  • 克隆注意事项: 当您克隆包含任务的模式或数据库时,所有任务都会随其属性一起克隆。但是,克隆环境中任务的执行可能需要其他权限,具体取决于特定的配置和依赖项(例如,仓库、计划)。

示例工作流程

创建新任务

创建或修改现有任务

克隆现有任务

这些信息涵盖了使用 CREATE TASK 命令及其变体在 Snowflake 中创建、管理和克隆任务的基础。访问控制是确保任务安全地在适当的权限内执行的关键方面。

使用 SnowSQL 执行多个 SQL 语句

SnowSQL 是一个用于与 Snowflake 交互的命令行界面 (CLI)。在处理任务时,您可能希望在单个任务中执行多个 SQL 语句。但是,在任务的上下文中,Snowflake 支持直接在任务主体中执行单个 SQL 语句。要执行多个 SQL 语句,通常需要将它们包装在存储过程中,或者使用 Snowflake Scripting,它允许过程逻辑。

示例

假设您想在单个任务中将数据插入两个不同的表中。您可以通过创建一个包含多个 SQL 语句的存储过程,然后从任务中调用该过程来实现。

在此示例中,任务执行存储过程 my_procedure,其中包含多个 SQL 语句。

使用 Snowflake Scripting 进行过程逻辑

Snowflake Scripting 是一项功能,允许您在 SQL 脚本中编写过程逻辑,包括循环和条件语句等控制流构造。这对于更复杂的任务逻辑特别有用。

示例

以下是如何在任务中使用 Snowflake Scripting 的方法

在此示例中,该过程包含一个 IF 语句,展示了如何使用 Snowflake Scripting 为任务添加过程逻辑。

带配置的根任务

在 Snowflake 中,“根任务”是没有父任务的任务,通常作为任务层次结构(任务树)中的起点。根任务可以触发其他任务(子任务)来创建复杂的工作流。

配置根任务时,您将设置计划或基于事件的触发器,并且该任务可以作为一系列按顺序执行的任务的基础。

示例

在此场景中,root_task 是启动工作流的根任务。它完成后,将触发 child_task1,然后 child_task1 完成后将触发 child_task2。这是任务链接的一个示例。

使用 CREATE OR ALTER TASK 命令创建和修改简单任务

CREATE OR ALTER TASK 命令允许您创建新任务或修改现有任务。当您想避免手动检查任务是否已存在时,此功能尤其有用。

示例

  • CREATE OR ALTER TASK: 此命令检查 simple_task 是否存在。如果存在,则使用新定义修改任务;如果不存在,则创建任务。
  • WAREHOUSE: 指定任务将使用的计算仓库。
  • SCHEDULE: 此任务计划每天在上午 6 点运行。
  • SQL Statement: 此任务将当前日期在 sales 表中的数据插入 daily_sales 表。

ALTER TASK

Snowflake 中的 ALTER TASK 命令用于修改现有任务。这包括更改其配置,例如计划、仓库或 SQL 语句,以及控制任务的状态(例如,启动、停止、恢复或挂起)。

语法

参数

参数描述示例
task_name要修改的任务的名称。任务名称在模式中必须是唯一的。daily_report_task, etl_process_task
**` SETUNSET`**使用 SET 修改任务的属性,或使用 UNSET 删除属性或将其重置为默认值。
WAREHOUSE = <warehouse_name>指定任务执行时使用的仓库。您可以更改与任务关联的仓库。my_warehouse, comp
**`SCHEDULE = 'cron_schedule'AFTER <preceding_task_name>`**修改任务的计划。您可以提供新的 cron 计划,或指定一个必须在此任务运行之前完成的任务。
USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = <size>设置或更改任务的托管仓库的初始大小。'XSMALL', 'LARGE'
**`ALLOW_OVERLAPPING_EXECUTION = TRUEFALSE`**确定是否允许任务并发运行多个实例。TRUE 允许重叠执行,FALSE 则不允许。
COMMENT = '<comment>'添加或修改与任务关联的注释。COMMENT = 'Daily data load task'
SESSION_PARAMETER = <value>修改任务执行的特定会话参数。DATE_OUTPUT_FORMAT = 'YYYY-MM-DD'
SET TAG <tag_name> = '<tag_value>'用特定标签值标记任务,这对于组织或跟踪很有用。SET TAG department = 'finance'
RESUME恢复挂起的任务。恢复后,任务将开始根据其计划或触发器执行。ALTER TASK my_task RESUME;
SUSPEND挂起任务,阻止其执行。任务将保留但不会运行,直到被恢复。ALTER TASK my_task SUSPEND;

使用说明

  • 任务状态控制
    • RESUME 和 SUSPEND 用于控制任务的执行状态。当任务被挂起时,它不会根据其计划或触发器运行,直到被恢复。这在维护期间很有用,或者当您想临时停止任务执行而不删除任务时。
  • 任务配置更改
    • 使用 ALTER TASK,您可以更改现有任务的仓库、计划、SQL 语句和其他配置,而无需删除并重新创建任务。这使得在业务需求变化时能够灵活地管理任务。
  • 并发和重叠执行
    • 当处理执行时间可能超过其计划频率的任务时,ALLOW_OVERLAPPING_EXECUTION 参数非常重要。如果允许重叠执行,任务可以多次并发运行,这对于某些高频率任务可能很有必要。
  • 依赖管理
    • 如果您的任务是任务链的一部分,修改计划或依赖项(AFTER 子句)可能会影响整个工作流。在修改任务时,请确保正确管理任务依赖项。

示例

示例 1:修改任务的计划

这会将 daily_report_task 的计划更改为每天上午 6 点运行。

示例 2:更改任务的仓库

这会将 etl_task 使用的仓库更改为 large_wh。

示例 3:挂起任务

这会挂起 data_refresh_task,阻止其运行,直到恢复。

示例 4:恢复任务

这会恢复 data_refresh_task,使其可以根据其计划运行。

示例 5:允许重叠执行

这会修改 high_frequency_task 以允许多个实例并发运行。

示例 6:为任务添加注释

这会添加或更新 monthly_backup_task 的注释。

  • 使用 SnowSQL 执行多个 SQL 语句: 通过将多个语句封装在存储过程中或使用 Snowflake Scripting 来实现。
  • 使用 Snowflake Scripting 进行过程逻辑: 允许在任务中使用高级控制流结构。
  • 带配置的根任务: 根任务可以是任务链的基础,通过计划或事件触发器进行配置。

这些工具和技术使您能够有效地管理和自动化 Snowflake 中的复杂工作流。

DROP TASK

Snowflake 中的 DROP TASK 命令用于从您的数据库中删除现有任务。此命令会永久删除任务,包括其计划、配置和任何关联的元数据。

语法

参数

  • IF EXISTS
    • Description: 此可选子句允许您仅在任务存在时才删除它。如果任务不存在且未指定 IF EXISTS,则会返回错误。
    • Usage: DROP TASK IF EXISTS daily_report_task;
  • <task_name>
    • Description: 您要删除的任务的名称。此名称在模式中必须是唯一的。
    • Example: daily_report_task, data_ingestion_task.

使用说明

  • 不可逆操作
    • 删除任务是不可逆的操作。一旦任务被删除,它就无法恢复。如果您需要暂时禁用任务,请考虑使用 SUSPEND 命令而不是 DROP。
  • 依赖关系
    • 如果任务是任务树的一部分(即,它有子任务或依赖于另一个任务),则删除任务将影响整个链。在删除任务之前,请确保考虑对任何相关任务的影响。
  • 计划执行
    • 删除任务后,任何未来的任务执行都将被取消。任务的计划和任何关联的触发器将不再有效。
  • 权限
    • 要删除任务,您必须拥有任务的适当权限。通常,这需要 OWNERSHIP 权限或具有必要权限的角色。

示例

示例 1:删除任务

此命令从当前模式中删除 daily_report_task。如果任务不存在,则会返回错误。

示例 2:如果任务存在则删除

此命令仅在 data_ingestion_task 存在时才删除它。如果任务不存在,则不会返回错误,命令将成功完成。

示例 3:在特定模式中删除任务

此命令从 my_schema 模式中删除 monthly_cleanup_task。确保引用了正确的模式,以避免意外删除错误的任务。

  • DROP TASK 命令会永久删除 Snowflake 环境中的任务。
  • IF EXISTS 子句在尝试删除可能不存在的任务时很有用,可以避免错误。
  • 删除任务会影响任何计划的执行和依赖的任务,因此应谨慎操作。
  • 确保您拥有删除任务的适当权限,因为此操作是不可逆的。

这些功能使 DROP TASK 命令成为管理和清理 Snowflake 中任务的重要工具。

EXECUTE TASK

Snowflake 中的 SHOW TASKS 命令列出存在于当前模式、数据库或帐户中的任务。此命令可用于获取任务及其属性的概览,例如计划、状态以及它们执行的 SQL 语句。

语法

参数

  • IN DATABASE <database_name>
    • Description: 可选参数,将任务筛选为指定数据库中的任务。
    • Example: SHOW TASKS IN DATABASE my_database;/li>
  • IN SCHEMA <schema_name>
    • Description: 可选参数,将任务筛选为指定模式中的任务。
    • Example: SHOW TASKS IN SCHEMA my_schema;
  • <name>
    • Description: 要搜索任务的数据库或模式的名称。如果未提供,则显示当前上下文(数据库或模式)中的任务。

使用说明

  • Current Context: 如果未指定数据库或模式,SHOW TASKS 命令将列出当前模式中的任务。
  • Filtering Tasks: 您可以使用 IN DATABASE 或 IN SCHEMA 子句通过指定特定数据库或模式来筛选显示的任務。
  • Viewing Task Details: SHOW TASKS 命令提供了一个高级概览。要获取有关特定任务的更详细信息,请使用 DESCRIBE TASK 命令。
  • Output Limit: 可以使用 LIMIT 子句限制返回的任务数量,尽管这不是基本语法的一部分。

输出

SHOW TASKS 命令以表格形式输出一个结果集,包含以下列

列名描述示例
name任务的名称。daily_report_task
database_name包含任务的数据库名称。my_database
schema_name包含任务的模式名称。public
owner拥有任务的角色。ACCOUNT ADMIN
comment与任务相关的任何注释。The task for daily reporting
warehouse任务运行时使用的仓库。compute_wh
schedule任务运行的计划,以 cron 格式或在依赖其他任务时使用 AFTER 子句。USING CRON 0 6 * * *
状态任务的当前状态(STARTED、SUSPENDED)。STARTED
allow_overlapping_execution指示是否允许重叠执行(TRUE、FALSE)。FALSE
predecessor_tasks在此任务运行之前必须完成的任何任务的名称。ingest_data_task
sql_text任务执行的 SQL 语句或 Snowflake 脚本。CALL my_stored_procedure();
天气状况任务运行必须满足的任何条件。table_exists('my_table')
user_task_managed_initial_warehouse_size如果指定了托管仓库,则其初始大小。XSMALL
error_integration为任务指定的错误集成(如果有)。notify_integration
last_scheduled_time任务上次计划运行的时间。2024-08-01 06:00:00
next_scheduled_time任务的下一次计划运行时间。2024-08-02 06:00:00

示例

示例 1:显示当前模式中的所有任务

此命令列出当前模式中的所有任务。

示例 2:显示特定模式中的所有任务

此命令列出 my_schema 中的所有任务。

示例 3:显示特定数据库中的所有任务

此命令列出 my_database 中的所有任务。

示例 4:显示所有任务并按状态筛选

此命令列出 public 模式中当前处于 STARTED 状态的所有任务。

  • SHOW TASKS 命令提供指定范围(当前模式、数据库或特定模式)内任务的概览。
  • 它显示了任务名称、计划、状态以及任务执行的 SQL 文本等关键属性。
  • 使用 DESCRIBE TASK 获取有关特定任务的更详细信息。
  • 此命令可用于管理和审计 Snowflake 环境中的任务。

下一个主题Snowflake-use-cases