任务简介

Tasks are a powerful way to automate data processing and to optimize business procedures on your data pipeline.

任务可按计划时间运行,也可由事件触发(例如当 中有新数据到达时)。

Tasks can run SQL commands and stored procedures that use supported languages and tools, including JavaScript, Python, Java, Scala, and Snowflake scripting.

For complex workflows, you can create sequences of tasks called task graphs. Task graphs can use logic to perform dynamic behavior, running tasks in parallel or in series.

本主题内容:

限制

任务创建工作流概述

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

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

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

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

  5. 监控任务成本

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

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

Define compute resources

任务需要计算资源来运行语句和存储过程。您可在以下两种模式中选择:

Serverless Task

采用此模式时,由您设置任务运行时间,Snowflake 将预测并分配在该时间内完成任务所需的计算资源。该预测基于对同一任务最近运行情况的动态分析。

限制

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

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

Use CREATE TASK to define the task. Don't include the WAREHOUSE parameter.

The role that runs the task must have the global EXECUTE MANAGED TASK privilege. For more information, see 任务安全性.

The following example creates a task that runs every hour.

CREATE TASK SCHEDULED_T1
  SCHEDULE='60 MINUTES'
  AS SELECT 1;
Copy
Serverless Task 任务计算模型示意图。

Cost and performance: Warehouse sizes

为确保 Serverless Task 高效运行,您可通过设置以下参数来指定最小和最大 仓库规模

  • SERVERLESS_TASK_MIN_STATEMENT_SIZE: the minimum warehouse size for predictable performance (default: XSMALL).

  • SERVERLESS_TASK_MAX_STATEMENT_SIZE: the maximum warehouse size to prevent unexpected costs (default: XXLARGE).

After a task completes, Snowflake reviews the performance and adjusts compute resources for future runs within these limits.

以下示例展示了一个每 30 秒运行的任务,其最小仓库规模为 SMALL,最大仓库规模为 LARGE。

CREATE TASK SCHEDULED_T2
  SCHEDULE='30 SECONDS'
  SERVERLESS_TASK_MIN_STATEMENT_SIZE='SMALL'
  SERVERLESS_TASK_MAX_STATEMENT_SIZE='LARGE'
  AS SELECT 1;
Copy

目标完成间隔

您可以为 Serverless Task 设置更早的完成目标。无服务器触发任务 必须设置目标完成间隔。

设置后,Snowflake 将估算并扩展资源以在目标完成间隔内完成任务。当任务已达到最大仓库规模且运行时间过长时,目标完成间隔将被忽略。

以下示例中,任务每天午夜运行,目标在凌晨 2 点前完成。开始时间和时区通过 USING CRON 定义。如果任务达到最大仓库规模,可能运行长达三小时才会最终触发超时。

CREATE TASK SCHEDULED_T3
  SCHEDULE='USING CRON 0 * * * * America/Los_Angeles'
  TARGET_COMPLETION_INTERVAL='120 MINUTE'
  SERVERLESS_TASK_MAX_STATEMENT_SIZE='LARGE'
  USER_TASK_TIMEOUT_MS = 10800000         -- (3 hours)
  SUSPEND_TASK_AFTER_NUM_FAILURES = 3
  AS SELECT 1;
Copy
Diagram showing a serverless task scheduled daily between midnight and 2 a.m.

用户管理的虚拟仓库模型

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

Choose a warehouse

When choosing a warehouse, consider the following:

  • 查阅 仓库注意事项 中的最佳实践。

  • 根据仓库规模和群集配置,分析使用不同仓库时的平均任务运行时间。有关更多信息,请参阅 任务持续时间

  • 如果仓库由多个进程共享,需考虑任务对其他工作负载的影响。

Create a task using the user-managed compute model

Use CREATE TASK, and include the WAREHOUSE parameter.

The role that runs the task must have the global EXECUTE MANAGED TASK privilege. For more information, see 任务安全性.

The following example creates a task that runs every hour.

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

有关选择计算模型的建议

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

类别

Serverless Task

由用户管理的任务

备注

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

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

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

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

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

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

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

计划间隔

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

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

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

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

Increasing the compute resources can reduce the runtime of some, but not all, SQL code. It doesn't ensure a task run is completed within the batch window.

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

定义时间表或触发器

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

任务创建后,初始状态为暂停。如果要使任务遵循时间表或持续检测事件,请使用 ALTER TASK ... RESUME。要单次运行任务,请使用 EXECUTE TASK

按固定时间表运行任务

To run tasks on a fixed schedule, define the schedule when creating or altering task using CREATE TASK or ALTER TASK, or by editing the task in Snowsight, using the SCHEDULE parameter.

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

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

To run tasks whenever a defined stream has new data, use 触发型发任务. This approach is useful for Extract, Load, Transform (ELT) workflows, because it eliminates frequent polling of the source when new data arrival is unpredictable. It also reduces latency by processing data immediately. For example:

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

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

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

You can combine a scheduled task with a triggered task. For example, the following code creates a task that checks a stream for new data every hour:

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 会自动缩放资源,以确保任务在目标完成间隔(包括排队时间)内完成。

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

任务安全性

To run tasks, you must have the correct access privileges. This section describes how to manage access to tasks.

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

访问控制权限

创建任务

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

对象

权限

备注

账户

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

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

删除任务所有者角色

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

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

由系统服务运行的任务

By default, tasks run as a system service that is decoupled from a user.

该系统服务使用与任务所有者相同的权限来运行任务。

此举避免了与用户管理相关的复杂性:例如,如果用户被删除、因认证问题被锁定或角色被移除,任务仍可继续运行而不中断。

The query history for task runs are associated with the system service. There are no user credentials for this service, and no individual can assume its identity. Activity for the system service is limited to your account. The same encryption protections and other security protocols are built into this service as are enforced for other operations.

使用用户权限运行任务

Tasks can be configured to run with the privileges of a specific user, in addition to privileges of the task owner role. Tasks specifying EXECUTE AS USER run on behalf of the named user, instead of the system service.

  • Manage multi-role privileges: In situations where users have secondary roles, users can run a task using the combined privileges of their primary and secondary roles. This configuration ensures that the task has the necessary permissions to access all required resources.

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

  • Provide accountability for all operations: All instances of a task that are run with EXECUTE AS USER are attributed to the configured user instead of the SYSTEM user. This attribution helps maintain a clear audit trail for all operations.

访问控制

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

When the task runs, the primary role of the task session will be the owner role of the task, and the user’s default secondary roles will be activated. Users will be able to switch primary roles with the USE ROLE command and adjust the secondary roles in the task session with the USE SECONDARY ROLES command.

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

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

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

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

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

  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. 查看日志。

    The SHOW GRANTS TO ROLE command would show that Jane granted the role to Billy. The QUERY_HISTORY view would then show that Billy modified the task. Future task runs would still appear as run by 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 提供以下一组函数:

更多 Python 示例

For more Python examples, see 使用 Python 管理 Snowflake 任务和任务图.

语言: 中文