任务简介¶
使用 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`。
您可以通过创建 任务图 来组合一系列任务。任务图可以使用逻辑来执行动态行为,并行或按顺序运行任务。
备注
任务不支持 表模式演化。
本主题内容:
任务创建工作流概述¶
创建一个 任务管理员角色,该角色可运行以下步骤中的命令。
使用 CREATE TASK 定义新任务。
使用 EXECUTE TASK 手动测试任务。
使用 ALTER TASK ... RESUME 允许任务持续运行。
根据需要使用 ALTER TASK 完善任务。
有关运行任务的信息,请参阅:
分配计算资源¶
Tasks 需要计算资源来执行 SQL、Python、Java 和 Scala 函数以及存储过程。对于每个任务,您可以选择是允许 Snowflake 通过创建 Serverless Task 来管理资源,还是使用 用户管理的虚拟仓库模型 自行管理资源。
Serverless Task¶
可通过此模型,在 Snowflake 管理的计算上执行任务。Snowflake 会根据每个工作负载的需要自动调整资源大小。Snowflake 对同一项任务最近一次运行的统计数据执行动态分析,并根据结果确定给定运行的计算资源的理想大小。
建议将此模型用于定期或半定期运行的任务,例如:
始终在同一时间启动的任务。
仅在新数据到达时运行的任务。(有关更多信息,请参阅 触发型发任务。)
限制¶
使用无服务器计算模型创建任务¶
如果使用 CREATE TASK 或 ALTER TASK,请省略 WAREHOUSE 参数。
执行任务的角色必须具有全局 EXECUTE MANAGED TASK 权限。有关任务的访问控制要求的更多信息,请参阅 任务安全性。
您可以通过设置以下参数来控制 Serverless Task 的成本和性能:
SERVERLESS_TASK_MAX_STATEMENT_SIZE:仓库的最大大小,以防止出现意外费用。
SERVERLESS_TASK_MIN_STATEMENT_SIZE:仓库的最小大小,以确保性能可预测。
TARGET_COMPLETION_INTERVAL:任务应执行的时间窗口。
Snowflake 如何估算无服务器计算资源¶
Snowflake 会根据目标时间范围以及之前任务运行的性能自动估算完成任务所需的计算资源。
您可以使用 TARGET_COMPLETION_INTERVAL 设置目标时间范围。如果未设置此值,Snowflake 会调整无服务器计算资源的大小,以在下一个计划的执行时间之前完成。
任务完成后,Snowflake 会按以下方式估算所需的计算资源:
示例¶
示例 1:创建每小时运行一次的 Serverless Task 任务。Snowflake 分配无服务器计算资源,估计这些资源将在计划时间内完成任务。
CREATE TASK SCHEDULED_T1
SCHEDULE='60 MINUTES'
AS SELECT 1;
from datetime import timedelta
from snowflake.core.task import Cron, Task
tasks = root.databases["TEST_DB"].schemas["TEST_SCHEMA"].tasks
task = tasks.create(
Task(
name="SCHEDULED_T1",
definition="SELECT 1",
schedule=timedelta(minutes=60),),
),
)
示例 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;
from datetime import timedelta
from snowflake.core.task import Cron, Task
tasks = root.databases["TEST_DB"].schemas["TEST_SCHEMA"].tasks
task = tasks.create(
Task(
name="SCHEDULED_T2",
definition="SELECT 1",
schedule=Cron("0 * * * *", "America/Los_Angeles"),
target_completion_interval=timedelta(minutes=120),
serverless_task_max_statement_size="LARGE",
),
)
示例 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;
from datetime import timedelta
from snowflake.core.task import Cron, Task
tasks = root.databases["TEST_DB"].schemas["TEST_SCHEMA"].tasks
task = tasks.create(
Task(
name="SCHEDULED_T3",
definition="SELECT 1",
schedule=Cron("0 0 * * *", "UTC"),
target_completion_interval=timedelta(minutes=180),
serverless_task_min_statement_size="MEDIUM",
serverless_task_max_statement_size="LARGE",
),
)
通过此配置,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;
from datetime import timedelta
from snowflake.core.task import Cron, Task
tasks = root.databases["TEST_DB"].schemas["TEST_SCHEMA"].tasks
task = tasks.create(
Task(
name="SCHEDULED_T4",
definition="SELECT 1",
schedule=timedelta(seconds=10),
serverless_task_max_statement_size="LARGE",
),
)
使用此配置,Serverless Task 每 10 秒运行一次。如果一系列任务执行持续时间未在下一个计划时间之前完成,Snowflake 会自动调整无服务器计算的大小,以便任务执行在指定的 SCHEDULE 内完成,直到达到 SERVERLESS_TASK_MAX_STATEMENT_SIZE。
有关参数和语法的更多信息,请参阅 CREATE TASK 和 ALTER TASK。
用户管理的虚拟仓库模型¶
通过此模型,您可以完全控制每个工作负载所使用的计算资源。
当您想要手动管理计算资源上不可预测的负载时,建议使用此模型。启用了 自动暂停和自动恢复 的 多集群仓库 还有助于调节 Credit 的消耗。
选择仓库大小¶
如果选择使用现有仓库为单项任务提供计算资源,请遵循 仓库注意事项 中描述的最佳实践。要了解任务的计算需求,可根据仓库大小和群集情况,使用不同的仓库分析单项任务或 任务图 的平均运行时间。还应考虑仓库是否由多个进程共享。有关更多信息,请参阅 任务持续时间。
有关选择计算模型的建议¶
下表描述了有助于决定何时使用 Serverless Task 与由用户管理的任务的各种因素:
类别 |
Serverless Task |
由用户管理的任务 |
备注 |
---|---|---|---|
并发任务工作负载的数量、持续时间和可预测性 |
建议用于利用率较低、同时运行的任务太少或完成速度较快的仓库。 运行相对稳定的任务是 Serverless Task 的理想选择。 |
建议用于运行多项并发任务的充分利用的仓库。 |
对于 Serverless Task,Snowflake 根据计算资源的实际使用量向您的账户计费。 对于由用户管理的任务,仓库的计费基于仓库大小,每次恢复仓库的最短时间为 60 秒。 |
计划间隔 |
如果遵守计划间隔非常重要,建议使用此项。 如果独立任务或计划任务图的运行超过了间隔时间,则 Snowflake 会增加计算资源的大小。 |
如果遵守计划间隔不太重要,建议使用此项。 |
计划间隔 是指任务图中独立任务或根任务的计划执行之间的时间间隔。 增加计算资源可减少部分(但不是全部)SQL 代码的执行时间,但不能确保在批处理窗口内完成任务运行。 |
Serverless Task 运行的最大大小等于 XXLARGE 仓库的大小。如果一个任务工作负载需要更大的仓库,则创建一个具有所需大小仓库的由用户管理的任务。
定义时间表或触发器¶
可以将任务设置为按固定时间表运行,也可以由事件触发,例如,当数据流有新数据时。
注意:即使定义了时间表或触发器,任务也会在暂停状态下启动。之后,您可以使用 EXECUTE TASK 开始单次运行任务,也可以使用 ALTER TASK ... RESUME 允许它持续运行。
按固定时间表运行任务¶
要按固定时间表运行任务,请在创建或更改任务时使用 CREATE TASK 或 ALTER TASK,或通过在 Snowsight 中编辑任务时使用 SCHEDULE 参数定义时间表。
Snowflake 确保一次只执行一个具有计划的任务实例。如在下一个计划内的执行时间到来时,任务仍在运行,则会跳过该计划内的时间。
以下示例创建了一个每 10 秒运行一次的任务:
CREATE TASK task_runs_every_10_seconds
SCHEDULE='10 SECONDS'
AS SELECT 1;
要根据特定时间或日期定义时间表,请使用 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;
有关更多信息,请参阅 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;
有关更多信息,请参阅 触发型发任务。
按计划运行,但前提是数据流有新数据¶
您可以将计划任务与触发任务相结合。例如,您可以将任务设置为每小时运行一次,但前提是该数据流有新数据。示例:
CREATE TASK triggered_task_stream
SCHEDULE = '1 HOUR'
WHEN SYSTEM$STREAM_HAS_DATA('orders_stream')
AS SELECT 1;
定义任务失败时会发生什么¶
在运行失败后自动暂停任务¶
(可选)在指定次数的连续运行失败或超时后自动暂停任务。此功能可暂停消耗 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);
ALTER TASK my_task
SET USER_TASK_TIMEOUT_MS = 10000 -- Changes maximum runtime to 10 seconds
运行任务¶
本节介绍计划和运行任务的不同方式以及如何确定任务的版本。
手动运行任务¶
使用 CREATE TASK 或 ALTER TASK 设置新任务及其参数后,您可以使用 EXECUTE TASK 开始任务的单次运行。此命令对于测试新的或修改过的任务很有用。
备注
可直接在脚本或存储过程中调用此 SQL 命令。
此命令支持在外部数据管道中集成任务。
任何可以通过身份验证进入您 Snowflake 账户并授权 SQL 操作的第三方服务都可以通过 EXECUTE TASK 命令来运行任务。
任务运行的版本控制¶
首次恢复或手动执行独立任务时,系统会设置任务的初始版本。独立任务使用此版本运行。暂停和修改任务后,恢复或手动执行独立任务时会设置新版本。
当任务暂停时,任务的所有未来计划运行都将被取消;但是,当前运行的任务将使用当前版本继续运行。
例如,假设任务已暂停,但任务的计划运行已开始。任务的所有者在任务仍在运行期间修改任务调用的 SQL 代码。任务使用任务开始运行时的当前版本运行并执行其定义中的 SQL 代码。恢复或手动执行任务时,将会为任务设置一个新版本。这个新版本包括对任务的修改。
要检索任务版本的历史记录,请查询 TASK_VERSIONS Account Usage 视图 (在 SNOWFLAKE 共享数据库中)。
查看账户的任务历史记录¶
可以使用 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>') ) );
要检索所有 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;
监控成本¶
无服务器任务在使用时会产生 计算成本。您可以使用 ACCOUNT_USAGE 和 ORGANIZATION_USAGE 架构中的成本相关视图来跟踪与无服务器任务相关的成本。在查询这些视图时,请对 service_type
列进行筛选以查找 SERVERLESS_TASK
或 SERVERLESS_TASK_FLEX
值。
视图 |
架构 |
|
具有所需权限的角色 |
---|---|---|---|
ACCOUNT_USAGE |
SERVERLESS_TASK |
ACCOUNTADMIN 角色 USAGE_VIEWER 数据库角色 |
|
ACCOUNT_USAGE |
SERVERLESS_TASK |
ACCOUNTADMIN 角色 USAGE_VIEWER 数据库角色 |
|
ORGANIZATION_USAGE |
SERVERLESS_TASK |
ACCOUNTADMIN 角色 USAGE_VIEWER 数据库角色 |
|
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;
示例: 查看 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;
有关每个计算小时为 Trust Center 运营收取多少 credit 的信息,请参阅 `Snowflake 服务消耗表 `_ 中的表 5。
任务持续时间¶
任务持续时间包括从任务计划开始到任务完成执行的时间。此持续时间包括以下两项:
排队时间: 任务在开始执行之前,等待计算资源可用所花费的时间。要计算排队时间,请查询 TASK_HISTORY 视图,并将 SCHEDULED_TIME 与 QUERY_START_TIME 进行比较。
执行时间: 任务执行其 SQL 语句或其他操作所花费的时间。要计算执行时间,请查询 TASK_HISTORY 视图,并将 QUERY_START_TIME 与 COMPLETED_TIME 进行比较。
例如,下图显示了计划每 15 秒运行一次的无服务器任务。此任务运行的总持续时间为 12 秒,其中包括 5 秒的排队时间和 7 秒的执行时间。
超时¶
如果任务运行超过计划时间或目标完成间隔,则默认情况下,该任务将继续运行直到完成、超时或失败。
当同时设置 STATEMENT_TIMEOUT_IN_SECONDS 和 label-user_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.';
from snowflake.core.role import Role
root.session.use_role("SYSADMIN")
my_role = Role(
name="warehouse_task_creation",
comment="This role can create user-managed tasks."
)
root.roles.create(my_role)
USE ACCOUNTADMIN;
GRANT CREATE TASK
ON SCHEMA schema1
TO ROLE warehouse_task_creation;
from snowflake.core.role import Securable
root.session.use_role("ACCOUNTADMIN")
root.roles['warehouse_task_creation'].grant_privileges(
privileges=["CREATE TASK"], securable_type="schema", securable=Securable(name='schema1')
)
GRANT USAGE
ON WAREHOUSE warehouse1
TO ROLE warehouse_task_creation;
from snowflake.core.role import Securable
root.roles['warehouse_task_creation'].grant_privileges(
privileges=["USAGE"], securable_type="warehouse", securable=Securable(name='warehouse1')
)
作为可以创建 Serverless Task 的角色的示例;创建一个名为 serverless_task_creation
的自定义角色,并授予角色 CREATE TASK 权限和账户级别 EXECUTE MANAGED TASK 权限。
USE SYSADMIN;
CREATE ROLE serverless_task_creation
COMMENT = 'This role can create serverless tasks.';
from snowflake.core.role import Role
root.session.use_role("SYSADMIN")
my_role = Role(
name="serverless_task_creation",
comment="This role can create serverless tasks."
)
root.roles.create(my_role)
USE ACCOUNTADMIN;
GRANT CREATE TASK
ON SCHEMA schema1
TO ROLE serverless_task_creation;
from snowflake.core.role import Securable
root.session.use_role("ACCOUNTADMIN")
root.roles['serverless_task_creation'].grant_privileges(
privileges=["CREATE TASK"], securable_type="schema", securable=Securable(name='schema1')
)
GRANT EXECUTE MANAGED TASK ON ACCOUNT
TO ROLE serverless_task_creation;
root.roles['serverless_task_creation'].grant_privileges(
privileges=["EXECUTE MANAGED TASK"], securable_type="account"
)
创建自定义角色来管理任务¶
创建一个自定义角色,授予其 EXECUTE TASK 权限,然后为此自定义角色授予任何任务所有者角色,以允许更改他们自己的任务。要移除任务所有者角色执行任务的能力,可以从任务所有者角色中撤消该自定义角色。
例如,创建一个名为 taskadmin
的自定义角色,并授予该角色 EXECUTE TASK 权限。将 taskadmin
角色分配给名为 myrole
的任务所有者角色:
USE ROLE securityadmin;
CREATE ROLE taskadmin;
from snowflake.core.role import Role
root.session.use_role("securityadmin")
root.roles.create(Role(name="taskadmin"))
在将账户级权限授予新角色之前,将活动角色设置为 ACCOUNTADMIN
USE ROLE accountadmin;
GRANT EXECUTE TASK, EXECUTE MANAGED TASK ON ACCOUNT TO ROLE taskadmin;
root.session.use_role("accountadmin")
root.roles['taskadmin'].grant_privileges(
privileges=["EXECUTE TASK", "EXECUTE MANAGED TASK"], securable_type="account"
)
将活动角色设置为 SECURITYADMIN 以表示该角色可将一个角色授予给另一个角色
USE ROLE securityadmin;
GRANT ROLE taskadmin TO ROLE myrole;
from snowflake.core.role import Securable
root.session.use_role("securityadmin")
root.roles['myrole'].grant_role(role_type="ROLE", role=Securable(name='taskadmin'))
有关创建自定义角色和角色层次结构的更多信息,请参阅 配置访问控制。
删除任务所有者角色¶
当删除任务的所有者角色时,该任务会将所有权转移给删除所有者角色的那个角色。当任务转移所有权时,它会自动暂停,并且在新的所有者恢复任务之前不会计划新的执行。
如果在任务运行时删除角色,则任务运行将在被删除的角色下完成处理。
系统服务任务执行¶
虽然 Snowflake 可以以任务所有者的权限运行任务,但任务运行与用户无关。实际上,每次运行都是由系统服务执行的。任务与特定用户是分离的,以避免用户被删除、因身份验证问题而被锁定或角色被移除时可能出现的复杂情况。
由于任务运行与用户分离,任务运行的查询历史记录与系统服务相关联。因此,该服务没有用户凭据,并且没有个人可冒充其身份。系统服务的活动仅限于您的账户。该服务内置了与其他操作相同的加密保护和其他安全协议。
任务 DDL¶
为支持创建和管理任务,Snowflake 提供以下一组特殊的 DDL 操作:
此外,提供商可以使用以下标准访问控制 DDL,来查看、授予或撤消对 ELT 所需数据库对象的访问权限:
grant_future_privileges
grant_privileges
grant_privileges_on_all
grant_role
iter_future_grants_to
iter_grants_to
revoke_future_privileges
revoke_grant_option_for_future_privileges
revoke_grant_option_for_privileges
revoke_grant_option_for_privileges_on_all
revoke_privileges
revoke_privileges_on_all
revoke_role
`RoleResource </developer-guide/snowflake-python-api/reference/latest/_autosummary/snowflake.core.role.RoleResource>`_(账户角色)方法:
grant_future_privileges
grant_privileges
grant_privileges_on_all
grant_role
iter_future_grants_to
iter_grants_of
iter_grants_on
iter_grants_to
revoke_future_privileges
revoke_grant_option_for_future_privileges
revoke_grant_option_for_privileges
revoke_grant_option_for_privileges_on_all
revoke_privileges
revoke_privileges_on_all
revoke_role
UserResource 方法:
grant_role
iter_grants_to
revoke_role
任务函数¶
为支持检索任务相关信息,Snowflake 提供以下一组函数: