任务简介

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

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

您可以通过创建 任务图 来组合一系列任务。任务图可以使用逻辑来执行动态行为,并行或按顺序运行任务。

备注

任务不支持 表模式演化

本主题内容:

任务创建工作流概述

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

  2. 使用 CREATE TASK 定义新任务。

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

  4. 使用 ALTER TASK ... RESUME 允许任务持续运行。

  5. 监控任务成本

  6. 根据需要使用 ALTER TASK 完善任务。

有关运行任务的信息,请参阅:

分配计算资源

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

Serverless Task

可通过此模型,在 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:任务应执行的时间窗口。

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

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

Serverless Task 任务计算模型示意图。

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

该示意图显示了计划在每天午夜至凌晨 2 点之间运行的 Serverless Task 任务。

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

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

  • 如果任务完成得过慢(在比目标时间框架多一个时间因子的时间内完成),Snowflake 会在后续运行中将资源规模扩大一个 仓库大小。当达到 SERVERLESS_TASK_MAX_STATEMENT_SIZE 时,任务会继续(可能超过目标时间),直到任务完成或超时为止。

示例

示例 1:创建每小时运行一次的 Serverless Task 任务。Snowflake 分配无服务器计算资源,估计这些资源将在计划时间内完成任务。

CREATE TASK SCHEDULED_T1
  SCHEDULE='60 MINUTES'
  AS SELECT 1;
Copy

示例 2:创建每天运行的 Serverless Task,从午夜开始运行 2 小时。时间表(使用 CRON)定义任务的开始时间,包括时区。目标完成间隔定义任务应何时完成。Snowflake 估计并分配无服务器计算,以便任务在计划时间内完成。

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

示例 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:创建计划每 10 秒运行一次的 Serverless Task,设置目标完成间隔:

CREATE TASK SCHEDULED_T4
  SCHEDULE='10 SECONDS'
  SERVERLESS_TASK_MAX_STATEMENT_SIZE='LARGE'
  AS SELECT 1;
Copy

使用此配置,Serverless Task 每 10 秒运行一次。如果一系列任务执行持续时间未在下一个计划时间之前完成,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 仓库的大小。如果一个任务工作负载需要更大的仓库,则创建一个具有所需大小仓库的由用户管理的任务。

定义时间表或触发器

可以将任务设置为按固定时间表运行,也可以由事件触发,例如,当数据流有新数据时。

注意:即使定义了时间表或触发器,任务也会在暂停状态下启动。之后,您可以使用 EXECUTE TASK 开始单次运行任务,也可以使用 ALTER TASK ... RESUME 允许它持续运行。

按固定时间表运行任务

要按固定时间表运行任务,请在创建或更改任务时使用 CREATE TASKALTER TASK,或通过在 Snowsight 中编辑任务时使用 SCHEDULE 参数定义时间表。

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

以下示例创建了一个每 10 秒运行一次的任务:

CREATE TASK task_runs_every_10_seconds
  SCHEDULE='10 SECONDS'
  AS SELECT 1;
Copy

要根据特定时间或日期定义时间表,请使用 SCHEDULE ='USING CRON...' 参数。

以下示例使用 Americas/Los_Angeles 时区创建了一个每周日凌晨 3 点运行的任务:

CREATE TASK task_sunday_3_am_pacific_time_zone
  SCHEDULE='USING CRON 0 3 * * SUN America/Los_Angeles'
AS SELECT 1;
Copy

有关更多信息,请参阅 CREATE TASK ... SCHEDULE

每当数据流有新数据时,运行任务

触发型发任务 用于在定义的 数据流 中有新数据时运行任务,例如在 Extract、Load、Transform (ELT) 工作流中。这消除了在新数据的可用性不可预测时需要频繁轮询源的问题。它还减少了延迟,因为数据是立即处理的。示例:

CREATE TASK triggered_task_stream
  WHEN SYSTEM$STREAM_HAS_DATA('orders_stream')
  AS
    INSERT INTO completed_promotions
    SELECT order_id, order_total, order_time, promotion_id
    FROM orders_stream;
Copy

有关更多信息,请参阅 触发型发任务

按计划运行,但前提是数据流有新数据

您可以将计划任务与触发任务相结合。例如,您可以将任务设置为每小时运行一次,但前提是该数据流有新数据。示例:

CREATE TASK triggered_task_stream
  SCHEDULE = '1 HOUR'
  WHEN SYSTEM$STREAM_HAS_DATA('orders_stream')
  AS SELECT 1;
Copy

定义任务失败时会发生什么

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

(可选)在指定次数的连续运行失败或超时后自动暂停任务。此功能可暂停消耗 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 参数值,相关更改将在修改过的对象中的任务下次计划运行时应用到这些任务。

定义其他会话参数

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

要为任务设置会话参数,请使用 CREATE TASK 将参数添加到任务定义中,或使用 ALTER TASK ... SET 修改任务。示例:

CREATE TASK my_task
  SCHEDULE = 'USING CRON 0 * * * * UTC'
  TIMESTAMP_INPUT_FORMAT = 'YYYY-MM-DD HH24'
  USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = 'XSMALL'
  AS
    INSERT INTO mytable(ts) VALUES(CURRENT_TIMESTAMP);
Copy
ALTER TASK my_task
  SET USER_TASK_TIMEOUT_MS = 10000  -- Changes maximum runtime to 10 seconds
Copy

运行任务

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

手动运行任务

使用 CREATE TASKALTER TASK 设置新任务及其参数后,您可以使用 EXECUTE TASK 开始任务的单次运行。此命令对于测试新的或修改过的任务很有用。

备注

  • 可直接在脚本或存储过程中调用此 SQL 命令。

  • 此命令支持在外部数据管道中集成任务。

  • 任何可以通过身份验证进入您 Snowflake 账户并授权 SQL 操作的第三方服务都可以通过 EXECUTE TASK 命令来运行任务。

任务运行的版本控制

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

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

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

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

查看账户的任务历史记录

可以使用 SQL 或 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 界面中运行相同 :ref:` 语句的仓库使用情况),向您的账户收取 <label-virtual_warehouse_credit_usage>credit 使用量 `SQL。每秒 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 秒运行一次。

超时

如果任务运行超过计划时间或目标完成间隔,则默认情况下,该任务将继续运行直到完成、超时或失败。

当同时设置 STATEMENT_TIMEOUT_IN_SECONDSUSER_TASK_TIMEOUT_MS 时,超时是两个参数中 最低的 非零值。

当同时设置 STATEMENT_QUEUED_TIMEOUT_IN_SECONDS 和 USER_TASK_TIMEOUT_MS 时,以 USER_TASK_TIMEOUT_MS 的值为准。

有关任务图超时信息,请参阅 任务图超时

注意事项

  • 对于无服务器任务,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 可以以任务所有者的权限运行任务,但任务运行通常与用户无关。实际上,每次运行都是由系统服务执行的。任务与特定用户是分离的,以避免用户被删除、因身份验证问题而被锁定或角色被移除时可能出现的复杂情况。

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

使用用户权限运行任务

除了任务所有者角色的权限外,还可以将任务配置为使用特定用户的权限运行。指定 EXECUTE AS USER 的任务将以指定用户(而非系统用户)的身份运行。

  • 管理多角色权限: 在用户拥有次要角色的情况下,用户可以使用其主要和次要角色的组合权限来运行任务。此配置确保任务具有访问所有必需资源的必要权限。

  • 利用基于用户的数据掩码和行访问策略:在数据治理策略考虑查询用户的情况下,以用户身份运行任务可确保任务与适用策略兼容。

  • 确保所有操作的可追溯性: ​​所有使用 EXECUTE AS USER 运行的任务实例都将归属于配置的用户,而非 SYSTEM 用户。这种归属机制有助于为所有操作维护清晰的审计追踪记录。

访问控制

任务的所属角色必须被授予对 EXECUTE AS USER 指定用户的 IMPERSONATE 权限,且该指定用户必须被授予任务的所属角色。

任务运行时,任务会话的主要角色将是任务的所有者角色,用户的默认次要角色将被激活。用户将能够使用 USE ROLE 命令切换主要角色,并使用 USE SECONDARY ROLES 命令在任务会话中调整次要角色。

使用服务用户和角色共享任务

对于生产环境,我们建议您创建一个单独的服务用户来代表您的团队或业务流程。与以现有服务用户或个人用户身份运行的方式相比,此最佳实践有助于提升工作流的安全性:

  • 当任务以专用服务用户身份运行时,它只能获得预期权限的访问权限。反之,若用户冒充其他用户,则会获得与该用户关联的所有权限,其中可能包含非预期的权限,包括在创建和恢复任务后授予的用户权限。

  • 若任务以用户身份运行,当该人员离开部门或组织时,任务可能会被中断。

示例:设置服务用户和团队角色

  1. 使用管理员角色设置用于任务的服务用户。

    以下示例创建了一个名为 task_user 的服务用户:

    USE ROLE ACCOUNTADMIN;
    CREATE USER task_user;
    
    Copy
  2. 创建任务角色,然后将其授予服务用户:

    CREATE ROLE task_role;
    GRANT ROLE task_role to USER task_user;
    
    Copy
  3. 允许任务角色代表团队用户角色运行查询:

    GRANT IMPERSONATE ON USER task_user TO ROLE task_role;
    
    Copy
  4. 为任务角色授予相应的权限。

    USE ROLE ACCOUNTADMIN;
    
    -- Grant the team role the privileges to create tasks in a specific schema
    GRANT CREATE TASK
      ON SCHEMA schema1
      TO ROLE task_role;
    
    -- Grant the team role the privileges to use a specific warehouse
    GRANT USAGE
      ON WAREHOUSE warehouse1
      TO ROLE task_role;
    
    -- Grant the team role the privileges to run tasks on a serverless compute model
    GRANT EXECUTE MANAGED TASK ON ACCOUNT TO ROLE task_role;
    
    Copy

代表服务用户运行任务

在团队角色拥有任务所有权后,团队成员可以修改任务,并代表服务用户运行任务。

示例:

USE ROLE task_owner;

CREATE TASK team_task
  SCHEDULE='12 HOURS'
  EXECUTE AS USER task_user
  AS SELECT 1;
Copy

在前面的示例中,生成的日志将显示 task_user 修改了任务。

(仅用于测试)允许用户直接模拟其他用户

在测试变更或制作原型时,作为管理员,您可以允许用户直接模拟其他用户。虽然支持此方案,但不建议在生产环境中使用。

  1. 设置角色进行模拟:

    USE ROLE ACCOUNTADMIN;
    CREATE ROLE janes_role;
    GRANT ROLE janes_role to USER jane;
    GRANT IMPERSONATE ON USER jane TO ROLE janes_role;
    
    Copy
  2. 使用新角色创建任务:

    USE ROLE janes_role;
    
    CREATE TASK janes_task
      SCHEDULE='60 M' AS SELECT 1;
    
    Copy
  3. 将该角色授予其他用户。

    在以下示例中,用户 Jane 向用户 Billy 授予访问权限:

    --Logged in as Jane or account admin
    GRANT ROLE janes_role to USER billy;
    
    Copy
  4. 另一个用户修改任务。

    在以下示例中,用户 Billy 修改了任务:

    -- Logged in as billy
    USE ROLE janes_role;
    
    ALTER TASK janes_task
      SET EXECUTE AS USER jane;
    
    Copy
  5. 查看日志。

    SHOW GRANTS TO ROLE 命令将显示 Jane 将角色授予了 Billy。然后,QUERY_HISTORY 视图将显示 Billy 修改了任务。将来的任务运行仍将显示为由 Jane 运行。

    USE ROLE ACCOUNTADMIN;
    
    SHOW GRANTS TO ROLE janes_role;
    
    QUERY_HISTORY()
      WHERE QUERY_TEXT ILIKE '%janes_task%';
    
    Copy

任务数据定义语言 (DDL) 操作

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

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

任务函数

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

语言: 中文