任务简介

使用 Tasks 来自动执行、计划和优化数据管道上的业务过程。

在 Snowflake 中,任务可以使用 支持的语言和工具 <label-stored-procedures-handler-languages>`(如 SQL、JavaScript、Python、Java、Scala 或 Snowflake Scripting)执行对存储过程的调用。本主题提供了 SQL 和 Python 示例。有关更多 Python 示例,请参阅 :doc:/developer-guide/snowflake-python-api/snowflake-python-managing-tasks`。

对于复杂的过程(如生成报告或执行定期的表维护),通过创建 任务图 来合并任务。

要持续处理传入的新数据或已更改数据(像在提取、加载、转换 (ELT) 工作流中一样),可以使用触发任务将任务与 表流 相结合。

备注

任务不支持 表模式演化

本主题内容:

任务创建工作流概述

  1. 创建一个 任务管理员角色,该角色可运行以下步骤中的命令。

  2. 使用 CREATE TASK 定义新任务。默认情况下,该任务处于暂停状态。有关设置任务参数的信息,请参阅:

  3. 使用 EXECUTE TASK 手动测试任务。

  4. 更改任务,或使用 ALTER TASK ... RESUME。 有关运行任务的信息,请参阅:

计算资源

Tasks 需要计算资源来执行 SQL、Python、Java 和 Scala 函数以及存储过程。对于每个任务,您可以选择是允许 Snowflake 通过创建 Serverless Task 来管理资源,还是使用 用户管理的虚拟仓库模型 自行管理资源。

Serverless Task

通过此模型,Tasks 可在 Snowflake 管理的计算资源上执行。Snowflake 会根据每个工作负载的需求自动调整资源大小。Snowflake 对同一项任务最近一次运行的统计数据执行动态分析,并根据结果确定给定运行的计算资源的理想大小。

建议将此模型用于定期或半定期运行的任务,例如:

  • 始终在同一时间启动的任务。

  • 仅在新数据到达时运行的任务。(有关更多信息,请参阅 触发任务。)

限制

  • Serverless Task 的最大计算大小相当于 XXLARGE 虚拟仓库

  • 总任务时间可能包括任务开始前的延迟。有关更多信息,请参阅 任务持续时间

使用无服务器计算模型创建任务

如果使用 CREATE TASKALTER TASK,请省略 WAREHOUSE 参数。

执行任务的角色必须具有全局 EXECUTE MANAGED TASK 权限。有关任务的访问控制要求的更多信息,请参阅 任务安全性

您可以通过设置以下参数来控制 Serverless Task 的成本和性能:

  • SERVERLESS_TASK_MAX_STATEMENT_SIZE:仓库的最大大小,以防止出现意外费用。

  • SERVERLESS_TASK_MIN_STATEMENT_SIZE:仓库的最小大小,以确保性能可预测。

  • TARGET_COMPLETION_INTERVAL:任务应执行的时间窗口。

指定这些设置时,优先级如下:

  • SERVERLESS_TASK_MAX_STATEMENT_SIZE

  • SERVERLESS_TASK_MIN_STATEMENT_SIZE

  • TARGET_COMPLETION_INTERVAL

Snowflake 如何估算无服务器计算资源

Snowflake 会根据目标时间范围以及之前任务运行的性能自动估算完成任务所需的计算资源。

目标时间范围可以通过 TARGET_COMPLETION_INTERVAL 设置。如果未设置此值,Snowflake 会调整无服务器计算资源的大小,以在下一个计划的执行时间之前完成。

任务完成后,Snowflake 会按以下方式估算所需的计算资源:

  • 如果任务完成得过快(在比目标时间范围少一个时间因子的时间内完成),Snowflake 会在后续运行中将资源规模缩小一个 仓库大小

  • 如果任务完成得过慢(在比目标时间框架多一个时间因子的时间内完成),Snowflake 会在后续运行中将资源规模扩大一个 仓库大小

示例

示例 1:创建一个每小时运行一次的 Serverless Task,且目标完成间隔为 120 分钟:

CREATE TASK SCHEDULED_T1 SCHEDULE='USING CRON 0 * * * * America/Los_Angeles'
TARGET_COMPLETION_INTERVAL='120 MINUTE' AS SELECT 1;
Copy

通过将 TARGET_COMPLETION_INTERVAL 设置为一段相对较长的持续时间,这表明任务执行运行更长时间是可以接受的。Snowflake 会自动调整无服务器计算的大小,以便任务执行在指定的 TARGET_COMPLETION_INTERVAL 内完成。

示例 2:创建一个每小时运行一次的 Serverless Task,且目标完成时间为 10 分钟:

CREATE TASK SCHEDULED_T2 SCHEDULE='USING CRON 0 * * * * UTC'
TARGET_COMPLETION_INTERVAL='10 MINUTE'
SERVERLESS_TASK_MAX_STATEMENT_SIZE='LARGE'
AS SELECT 1;
Copy

通过将 TARGET_COMPLETION_INTERVAL 设置为一段相对较短的持续时间,这表明倾向于快速完成任务。Snowflake 会自动调整无服务器计算的大小,以便任务执行在指定的 TARGET_COMPLETION_INTERVAL 内完成,直到达到 SERVERLESS_TASK_MAX_STATEMENT_SIZE。

示例 3:创建一个 Serverless Task,计划每天在目标完成间隔内的某个时刻执行,并设置最小和最大仓库大小范围:

CREATE TASK SCHEDULED_T3 SCHEDULE='USING CRON 0 0 * * * UTC'
TARGET_COMPLETION_INTERVAL='180 M'
SERVERLESS_TASK_MIN_STATEMENT_SIZE='MEDIUM' SERVERLESS_TASK_MAX_STATEMENT_SIZE='LARGE' AS SELECT 1;
Copy

通过此配置,Serverless Task 每天午夜至少在 TARGET_COMPLETION_INTERVAL 为 3 小时的中型仓库上运行一次。Snowflake 会自动调整无服务器计算的大小,以便任务执行在指定的 TARGET_COMPLETION_INTERVAL 内完成,直到达到 SERVERLESS_TASK_MAX_STATEMENT_SIZE。

示例 4:创建一个每天计划一次且无目标完成间隔的 Serverless Task:

CREATE TASK SCHEDULED_T4 SCHEDULE='USING CRON 0 0 * * * UTC'
SERVERLESS_TASK_MAX_STATEMENT_SIZE='LARGE' AS SELECT 1;
Copy

通过此配置,Serverless Task 每天午夜运行一次。如果一系列任务执行持续时间未在下一个计划时间之前完成,Snowflake 会自动调整无服务器计算的大小,以便任务执行在指定的 SCHEDULE 内完成,直到达到 SERVERLESS_TASK_MAX_STATEMENT_SIZE。

有关参数和语法的更多信息,请参阅 CREATE TASKALTER TASK

用户管理的虚拟仓库模型

通过此模型,您可以完全控制每个工作负载所使用的计算资源。

当您想要手动管理计算资源上不可预测的负载时,建议使用此模型。启用了 自动暂停和自动恢复多集群仓库 还有助于调节 Credit 的消耗。

选择仓库大小

如果选择使用现有仓库为单项任务提供计算资源,请遵循 仓库注意事项 中描述的最佳实践。要了解任务的计算需求,可根据仓库大小和群集情况,使用不同的仓库分析单项任务或 任务图 的平均运行时间。还应考虑仓库是否由多个进程共享。有关更多信息,请参阅 任务持续时间

有关选择计算模型的建议

下表描述了有助于决定何时使用 Serverless Task 与由用户管理的任务的各种因素:

类别

Serverless Task

由用户管理的任务

备注

并发任务工作负载的数量、持续时间和可预测性

建议用于利用率较低、同时运行的任务太少或完成速度较快的仓库。

运行相对稳定的任务是 Serverless Task 的理想选择。

建议用于运行多项并发任务的充分利用的仓库。

还建议用于计算资源上不可预测的负载。启用了 自动暂停和自动恢复多集群仓库 有助于调节 credit 的消耗。

对于 Serverless Task,Snowflake 根据计算资源的实际使用量向您的账户计费。

对于由用户管理的任务,仓库的计费基于仓库大小,每次恢复仓库的最短时间为 60 秒。

计划间隔

如果遵守计划间隔非常重要,建议使用此项。

如果独立任务或计划任务图的运行超过了间隔时间,则 Snowflake 会增加计算资源的大小。

如果遵守计划间隔不太重要,建议使用此项。

计划间隔 是指任务图中独立任务或根任务的计划执行之间的时间间隔。

增加计算资源可减少部分(但不是全部)SQL 代码的执行时间,但不能确保在批处理窗口内完成任务运行。

Serverless Task 运行的最大大小等于 XXLARGE 仓库的大小。如果一个任务工作负载需要更大的仓库,则创建一个具有所需大小仓库的由用户管理的任务。

运行任务

本节介绍计划和运行任务的不同方式、如何处理任务失败以及如何确定任务的版本。

计划任务

在创建任务时使用 CREATE TASKALTER TASK 来定义计划。将任务组合成任务图时,使用根任务中的 CREATE TASK 和 ALTER TASK 命令定义计划。

Snowflake 确保一次只执行一个具有计划的任务实例。如在下一个计划内的执行时间到来时,任务仍在运行,则会跳过该计划内的时间。

Snowflake 会自动调整和缩放 Serverless Task 的计算资源大小。对于由用户管理的任务,选择合适的仓库大小,以便任务在计划内完成其工作负载。有关信息,请参阅 选择仓库大小

任务计划与夏令时

任务定义中的 cron 表达式支持指定时区。当从标准时间转换为夏令时或从夏令时转换为标准时间时,计划的任务可能会出现意外行为。

例如:

  • 在从夏令时转换为标准时间期间,计划于美国/洛杉矶时区 (0 1 * * * America/Los_Angeles) 1 AM 开始的任务将运行两次。一次是在1 AM 运行,另一次是在当地时间 1:59:59 AM 变为1:00:00 AM 时运行。

  • 在从标准时间转换为夏令时期间,计划于美国/洛杉矶时区 (0 2 * * * America/Los_Angeles) 2 AM 开始的任务将无法运行,因为当地时间会从 1:59:59 AM 变为 3:00:00 AM。

为避免因夏令时而意外执行任务,请考虑以下事项:

  • 不要将任务安排在 1 AM 到 3 AM 之间运行。

  • 每年两次手动调整在 1 AM 到 3 AM 之间计划任务的 cron 表达式,以补偿时间变化。

  • 使用不适用于夏令时的时间格式,如 UTC。

触发任务

每当定义的流有新数据时,使用触发任务自动运行任务。这消除了在新数据的可用性不可预测时需要频繁轮询源的问题。它还减少了延迟,因为数据是立即处理的。

在定义的流具有数据并触发任务运行之前,触发任务不会使用计算资源。

以下是触发任务的运行条件:

  • 当关联流跟踪的单个表(或多个表)中的数据发生更改时。

  • 当任务首次恢复时,使用流中已有的任何数据。

  • 触发的任务完成后,Snowflake 会检查是否有新数据到达流中。如果有,则任务将再次运行;否则,将跳过该任务。

  • 触发任务每 12 小时运行一次运行状况检查,以帮助防止流过时。

    • 如果流中没有数据,Snowflake 将跳过运行而不使用计算资源。

    • 任务说明必须在数据保留期到期之前使用流中的数据;否则,流将过时。有关更多信息,请参阅 避免流过期

图表显示,当新数据到达时,任务会使用这些数据。任务完成后,任务将重新启动以检查是否有新数据。没有新数据,则跳过该任务。之后,更多的数据到达,则触发第二个任务。在处理该任务时,会有更多数据传入。第二个任务完成后,该任务将再次运行,然后检测传入的新数据并对其进行处理。中午时分,任务会运行一次运行状况检查,但没有新数据,因此跳过该任务。

创建触发任务

使用 CREATE TASK,并使用 WHEN 子句定义目标流。(请勿包括 SCHEDULE 参数。)

通过选择以下其中一项,为任务分配计算资源

  • 要手动管理资源(用户管理的仓库任务),请添加 WAREHOUSE 参数。

  • 要允许 Snowflake 管理资源 (Serverless Task),请添加 TARGET_COMPLETION_INTERVAL 参数。Snowflake 会估算所需的资源并进行调整,以在此时间内完成任务。

将现有任务从计划任务迁移到触发任务

暂停任务,取消设置 SCHEDULE 参数,然后恢复任务。现有任务必须具有在 WHEN 子句中定义的目标流。

ALTER TASK task SUSPEND;
ALTER TASK task UNSET SCHEDULE;
ALTER TASK task RESUME;
Copy

将现有的用户管理的触发任务迁移到无服务器触发任务

暂停任务。移除 WAREHOUSE 参数并添加 TARGET_COMPLETION_INTERVAL 参数。恢复任务。有关更多信息,请参阅 无服务器任务

触发任务注意事项

  • SHOW TASKSDESC TASK 输出中,触发任务的 SCHEDULE 属性显示为 NULL

  • 在 information_schema 和 account_usage 架构的 task_history 视图的输出中,SCHEDULED_FROM 列显示为 TRIGGER。

  • 处理多个数据流时,可以使用以下条件参数来管理任务的启动时间:WHEN ANDWHEN OR

触发任务限制

  • 默认情况下,触发任务最多每 30 秒运行一次。您可以修改 USER_TASK_MINIMUM_TRIGGER_INTERVAL_IN_SECONDS 参数,以便更频繁地运行任务,最短间隔为 10 秒。

  • 不支持数据共享、目录表、外部表和混合表上的流。

  • 如果通过 视图上的流 触发任务,则通过视图上的流查询引用的表的任何更改也将触发该任务,且不受该查询中任何联接、聚合或筛选操作的影响。

触发任务示例

示例 1:创建一个用户管理任务,在两个流中任意一个流的数据发生变化时运行:

CREATE TASK my_task
  WHEN SYSTEM$STREAM_HAS_DATA('my_return_stream')
  OR   SYSTEM$STREAM_HAS_DATA('my_order_stream')
  WAREHOUSE = my_warehouse
  AS
    INSERT INTO customer_activity
    SELECT customer_id, return_total, return_date, return
    FROM my_return_stream
    UNION ALL
    SELECT customer_id, order_total, order_date, order
    FROM my_order_stream;
Copy

示例 2:创建一个任务,当在两个不同的数据流中检测到数据变化时运行。由于任务使用 AND 条件,如果两个流中只有一个有新数据,则会跳过该任务。

由于 TARGET_COMPLETION_INTERVAL 为 120 分钟,Snowflake 会估算并调整在此时间内完成任务所需的计算资源。

CREATE TASK triggeredTask
  WHEN SYSTEM$STREAM_HAS_DATA('orders_stream')
  TARGET_COMPLETION_INTERVAL='120 MINUTES'
  AS
    INSERT INTO completed_promotions
    SELECT order_id, order_total, order_time, promotion_id
    FROM orders_stream
    WHERE promotion_id IS NOT NULL;
Copy

手动运行任务

使用 CREATE TASKALTER TASK 创建新任务并设置任务参数。

使用 EXECUTE TASK 触发该任务的单次运行。SQL 命令对于测试新的或修改过的任务很有用。

可直接在脚本或存储过程中调用此 SQL 命令。此外,此命令还支持在外部数据管道中集成任务。任何可以通过身份验证进入您 Snowflake 账户并授权 SQL 操作的第三方服务都可以执行 EXECUTE TASK 命令来运行任务。

任务运行的版本控制

首次恢复或手动执行独立任务时,系统会设置任务的初始版本。独立任务使用此版本运行。暂停和修改任务后,恢复或手动执行独立任务时会设置新版本。

当任务暂停时,任务的所有未来计划运行都将被取消;但是,当前运行的任务将使用当前版本继续运行。

例如,假设任务已暂停,但任务的计划运行已开始。任务的所有者在任务仍在运行期间修改任务调用的 SQL 代码。任务使用任务开始运行时的当前版本运行并执行其定义中的 SQL 代码。恢复或手动执行任务时,将会为任务设置一个新版本。这个新版本包括对任务的修改。

要检索任务版本的历史记录,请查询 TASK_VERSIONS Account Usage 视图 (在 SNOWFLAKE 共享数据库中)。

在运行失败后自动暂停任务

(可选)在指定次数的连续运行失败或超时后自动暂停任务。此功能可暂停消耗 Snowflake credit 但无法运行至完成的任务,从而降低相关费用。

设置任务的 SUSPEND_TASK_AFTER_NUM_FAILURES = num 参数。当参数设置为大于 0 的值时,在超过指定的任务运行连续失败次数或超时后,任务将自动暂停。

可在创建任务时使用 CREATE TASK 或稍后使用 ALTER TASK 设置此参数。也可在 Snowsight 中更改此值。

还可以在账户、数据库或架构级别设置 SUSPEND_TASK_AFTER_NUM_FAILURES 参数。此设置适用于修改对象中包含的所有任务。请注意,在较低级别显式设置的参数将替换在较高级别设置的参数值。

自动重试失败的任务运行

如果任何任务在 FAILED 状态下完成,Snowflake 可以自动重试该任务。默认情况下禁用自动任务重试。要启用此功能,请将 TASK_AUTO_RETRY_ATTEMPTS 设置为大于 0 的值。

使用错误通知的任务会发送有关每次失败的重试尝试的通知。有关更多信息,请参阅 配置发送错误通知的任务

如果您在账户、数据库或架构级别设置 TASK_AUTO_RETRY_ATTEMPTS 参数值,相关更改将在修改过的对象中的任务下次计划运行时应用到这些任务。

为任务设置会话参数

可以为任务运行所在的会话设置会话参数。为此,请修改现有任务并使用 ALTER TASK ...:samp:SET {session_parameter} = {value}[, {session_parameter} = {value} ... ] 设置所需的参数值,或者在 Snowsight 中编辑任务。

任务支持所有会话参数。有关完整列表,请参阅 参数。Tasks 不支持账户或用户参数。

查看账户的任务历史记录

可以使用 SQL 或 Snowsight 来查看账户的任务历史记录。要在 Snowsight 中查看任务历史记录,请参阅 查看 Snowsight 中的任务和任务图。有关所需权限的信息,请参阅 查看任务历史记录

要查看单项任务的运行历史记录,请执行以下操作:

SQL:

查询 TASK_HISTORY 表函数(在 Snowflake Information Schema 中)。

要查看当前计划的或正在执行的任务图运行的详细信息,请执行以下操作:

SQL:

查询 CURRENT_TASK_GRAPHS 表函数(在 Snowflake Information Schema 中)。

要查看过去 60 分钟内成功执行、失败或取消的任务图运行历史记录,请执行以下操作:

SQL:

查询 COMPLETE_TASK_GRAPHS 表函数(在 Snowflake Information Schema 中)。

查询 COMPLETE_TASK_GRAPHS 视图 视图(在 Account Usage 中)。

任务成本

与运行任务以执行 SQL 代码相关的费用因任务的计算资源来源而异:

由用户管理的仓库

Snowflake 会根据任务运行时的仓库使用情况(类似于在客户端或 Snowflake Web 界面中执行相同 SQL 语句的仓库使用情况),向您的账户收取 credit 使用量。每秒 credit 计费和仓库自动暂停功能可以让您灵活地从较大的大小开始,然后调整大小以匹配您的工作负载。

无服务器计算模型

Snowflake 根据计算资源使用情况向您的账户计费。费用根据资源的总使用量(包括云服务使用量)计算,衡量方式是 计算小时 Credit 使用量。计算小时的成本根据仓库规模和查询运行时而变化。有关更多信息,请参阅 无服务器 Credit 使用量查询:Serverless Task 总成本

Snowflake 分析任务历史记录中的任务运行情况,动态确定无服务器计算资源的正确大小和数量。由于 Snowflake 自动缩放资源以管理任务运行,因此运行任务的成本按比例扩缩。

要了解任务消耗了多少 credit,请参阅 `Snowflake 服务使用表 `_ 中的“无服务器功能 credit 表”。

在创建任务时,考虑以下最佳实践来优化成本:

  • 将 SCHEDULE 设置为以较低频率运行。

  • 使用 auto-suspend 和 auto-retry 参数来防止在失败任务上浪费资源。

  • 为只需要在特定条件下(例如,当数据流中有新数据时)运行的任务设置 触发任务

  • 为无服务器功能创建预算和支出限制警报。有关更多信息,请参阅 通过预算监控 Credit 使用量

要检索特定任务的当前 Credit 使用量,请查询 SERVERLESS_TASK_HISTORY 表函数。以任务所有者的身份执行以下语句,其中 <database_name> is the database that contains the task and <task_name> 为任务名称:

SET num_credits = (SELECT SUM(credits_used)
  FROM TABLE(<database_name>.information_schema.serverless_task_history(
    date_range_start=>dateadd(D, -1, current_timestamp()),
    date_range_end=>dateadd(D, 1, current_timestamp()),
    task_name => '<task_name>')
    )
  );
Copy

要检索所有 Serverless Task 的当前 Credit 使用量,请查询 SERVERLESS_TASK_HISTORY 视图。以账户管理员的身份,执行以下语句:

SELECT start_time,
  end_time,
  task_id,
  task_name,
  credits_used,
  schema_id,
  schema_name,
  database_id,
  database_name
FROM snowflake.account_usage.serverless_task_history
ORDER BY start_time, task_id;
Copy

监控成本

无服务器任务在使用时会产生 计算成本。您可以使用 ACCOUNT_USAGE 和 ORGANIZATION_USAGE 架构中的成本相关视图来跟踪与无服务器任务相关的成本。在查询这些视图时,请对 service_type 列进行筛选以查找 SERVERLESS_TASKSERVERLESS_TASK_FLEX 值。

视图

架构

service_type

具有所需权限的角色

METERING_HISTORY

ACCOUNT_USAGE

SERVERLESS_TASK

ACCOUNTADMIN 角色 USAGE_VIEWER 数据库角色

METERING_DAILY_HISTORY

ACCOUNT_USAGE

SERVERLESS_TASK

ACCOUNTADMIN 角色 USAGE_VIEWER 数据库角色

METERING_DAILY_HISTORY

ORGANIZATION_USAGE

SERVERLESS_TASK

ACCOUNTADMIN 角色 USAGE_VIEWER 数据库角色

USAGE_IN_CURRENCY_DAILY

ORGANIZATION_USAGE

SERVERLESS_TASK

ORGADMIN 角色 GLOBALORGADMIN 角色 ORGANIZATION_USAGE_VIEWER 数据库角色

示例: 查看 Serverless Task 在整个组织中产生的账户总成本。

示例:查看 Serverless Task 在 2024 年 12 月 1 日至 2024 年 12 月 31 日期间产生的账户总成本。

SELECT
 name,
 SUM(credits_used_compute) AS total_credits
FROM
  SNOWFLAKE.ACCOUNT_USAGE.METERING_HISTORY
WHERE
 service_type ILIKE '%SERVERLESS_TASK%'
 AND start_time >= '2024-12-01'
 AND end_time <= '2024-12-31'
GROUP BY
 name
ORDER BY
 name ASC;
Copy

示例: 查看 Serverless Task 在整个组织中产生的账户总成本。

SELECT
  usage_date AS date,
  account_name,
  SUM(usage) AS credits,
  currency,
  SUM(usage_in_currency) AS usage_in_currency
FROM
  SNOWFLAKE.ORGANIZATION_USAGE.USAGE_IN_CURRENCY_DAILY
WHERE
  USAGE_TYPE ILIKE '%SERVERLESS_TASK%'
GROUP BY
  usage_date, account_name, currency
ORDER BY
  USAGE_DATE DESC;
Copy

有关每个计算小时为 Trust Center 运营收取多少 credit 的信息,请参阅 `Snowflake 服务消耗表 `_ 中的表 5。

任务持续时间

任务持续时间包括从任务计划开始到任务完成执行的时间。此持续时间包括以下两项:

  • 排队时间: 任务在开始执行之前,等待计算资源可用所花费的时间。要计算排队时间,请查询 TASK_HISTORY 视图,并将 SCHEDULED_TIME 与 QUERY_START_TIME 进行比较。

  • 执行时间: 任务执行其 SQL 语句或其他操作所花费的时间。要计算执行时间,请查询 TASK_HISTORY 视图,并将 QUERY_START_TIME 与 COMPLETED_TIME 进行比较。

例如,下图显示了计划每 15 秒运行一次的无服务器任务。此任务运行的总持续时间为 12 秒,其中包括 5 秒的排队时间和 7 秒的执行时间。

任务图,其中包括 5 秒的排队时间和 7 秒的执行时间。该任务计划每 15 秒运行一次。

注意事项

  • 对于无服务器任务,Snowflake 会自动缩放资源,以确保任务在目标完成间隔(包括排队时间)内完成。

  • 对于用户管理任务,当任务计划在共享或繁忙仓库上运行时,较长的排队时间很常见。

任务安全性

要开始执行任务,您必须具有正确的访问权限。本节介绍如何管理对任务的访问。

有关任务图所有权的信息,请参阅 管理任务图所有权

访问控制权限

创建任务

要创建任务,角色必须至少具有以下权限:

对象

权限

备注

账户

EXECUTE MANAGED TASK

仅对依赖于无服务器计算资源的任务是必需的。

数据库

USAGE

架构

USAGE、CREATE TASK

仓库

USAGE

仅对依赖于由用户管理的仓库的任务是必需的。

运行任务

创建任务后,任务所有者必须具有以下权限才能运行任务:

对象

权限

备注

账户

EXECUTE TASK

在执行角色拥有的任何任务时为必需。撤销某个角色的 EXECUTE TASK 权限会阻止所有后续任务在该角色下运行。

账户

EXECUTE MANAGED TASK

仅对依赖于无服务器计算资源的任务是必需的。

数据库

USAGE

架构

USAGE

任务

USAGE

仓库

USAGE

仅对依赖于由用户管理的仓库的任务是必需的。

此外,该角色必须具有运行任务执行的 SQL 语句所需的权限。

查看任务历史记录

要查看任务,您必须具有以下一个或多个权限:

  • ACCOUNTADMIN 角色

  • 任务的 OWNERSHIP 权限

  • 全局 MONITOR EXECUTION 权限

恢复或暂停任务

除任务所有者外,具有任务 OPERATE 权限的角色还可以暂停或恢复任务。此角色必须具有包含任务的数据库和架构的 USAGE 权限。不需要其他任何权限。

在恢复任务时,Snowflake 会验证任务所有者角色是否具有 运行任务 中所列出的权限。

创建自定义角色来管理任务权限

使用自定义角色,您可以轻松管理授予 Snowflake 中每个账户或角色的权限。要使用自定义角色更改所有账户或角色的权限,请更新自定义角色。或者,通过移除自定义角色来撤销权限。

创建自定义角色以创建任务

Snowflake 需要不同的权限来创建无服务器任务和由用户管理的任务。

例如,要创建由用户管理的任务,可以创建一个名为 warehouse_task_creation 的自定义角色,并就该角色可在其中创建任务的仓库授予角色 CREATE TASK 和 USAGE 权限。

USE SYSADMIN;

CREATE ROLE warehouse_task_creation
  COMMENT = 'This role can create user-managed tasks.';
Copy
USE ACCOUNTADMIN;

GRANT CREATE TASK
  ON SCHEMA schema1
  TO ROLE warehouse_task_creation;
Copy
GRANT USAGE
  ON WAREHOUSE warehouse1
  TO ROLE warehouse_task_creation;
Copy

作为可以创建 Serverless Task 的角色的示例;创建一个名为 serverless_task_creation 的自定义角色,并授予角色 CREATE TASK 权限和账户级别 EXECUTE MANAGED TASK 权限。

USE SYSADMIN;

CREATE ROLE serverless_task_creation
  COMMENT = 'This role can create serverless tasks.';
Copy
USE ACCOUNTADMIN;

GRANT CREATE TASK
  ON SCHEMA schema1
  TO ROLE serverless_task_creation;
Copy
GRANT EXECUTE MANAGED TASK ON ACCOUNT
  TO ROLE serverless_task_creation;
Copy

创建自定义角色来管理任务

创建一个具有 EXECUTE TASK 权限的自定义角色,并为此自定义角色授予任何任务所有者角色,以允许更改他们自己的任务。要移除任务所有者角色执行任务的能力,可以从任务所有者角色中撤消该自定义角色。

例如,创建一个名为 taskadmin 的自定义角色,并授予该角色 EXECUTE TASK 权限。将 taskadmin 角色分配给名为 myrole 的任务所有者角色:

USE ROLE securityadmin;

CREATE ROLE taskadmin;
Copy

在将账户级权限授予新角色之前,将活动角色设置为 ACCOUNTADMIN

USE ROLE accountadmin;

GRANT EXECUTE TASK, EXECUTE MANAGED TASK ON ACCOUNT TO ROLE taskadmin;
Copy

将活动角色设置为 SECURITYADMIN 以表示该角色可将一个角色授予给另一个角色

USE ROLE securityadmin;

GRANT ROLE taskadmin TO ROLE myrole;
Copy

有关创建自定义角色和角色层次结构的更多信息,请参阅 配置访问控制

删除任务所有者角色

当删除任务的所有者角色时,该任务会将所有权转移给删除所有者角色的那个角色。当任务转移所有权时,它会自动暂停,并且在新的所有者恢复任务之前不会计划新的执行。

如果在任务运行时删除角色,则任务运行将在被删除的角色下完成处理。

系统服务任务执行

虽然 Snowflake 可以以任务所有者的权限运行任务,但任务运行与用户无关。实际上,每次运行都是由系统服务执行的。任务与特定用户是分离的,以避免用户被删除、因身份验证问题而被锁定或角色被移除时可能出现的复杂情况。

由于任务运行与用户分离,任务运行的查询历史记录与系统服务相关联。因此,该服务没有用户凭据,并且没有个人可冒充其身份。系统服务的活动仅限于您的账户。该服务内置了与其他操作相同的加密保护和其他安全协议。

任务 DDL

为支持创建和管理任务,Snowflake 提供以下一组特殊的 DDL 操作:

此外,提供商可以使用以下标准访问控制 DDL,来查看、授予或撤消对 ELT 所需数据库对象的访问权限:

任务函数

为支持检索任务相关信息,Snowflake 提供以下一组函数:

语言: 中文