动态表访问控制

本主题讨论对动态表执行创建、查询、更改、查看和删除等操作所需的权限。

如需有关 Snowflake 权限模型的更多信息,请参阅 访问控制概述访问控制权限

转移所有权

要让用户完全访问动态表,可以执行以下任一操作:

分配授予时,请确保将对象类型指定为 DYNAMIC TABLE,因为动态表具有与常规表不同的权限集。

要授予动态表的 OWNERSHIP 权限,请确保接收角色在以下对象上具有 USAGE 权限。否则,后续的计划刷新将失败。

  • 包含动态表的数据库和架构。

  • 用于刷新表的仓库。

要转移动态表的所有权,您可以使用 GRANT OWNERSHIP 命令或 Snowsight

以下示例使用 GRANT OWNERSHIP 命令将 my_dynamic_table 的所有权权限授予 budget_admin 角色。

GRANT OWNERSHIP ON DYNAMIC TABLE my_dynamic_table TO ROLE budget_admin;
Copy

以下示例使用 GRANT OWNERSHIP 命令将所有权权限授予 budget_admin 角色,该权限适用于在 mydb.myschema 架构中创建的所有未来动态表。

GRANT OWNERSHIP ON FUTURE DYNAMIC TABLES IN SCHEMA mydb.myschema TO ROLE budget_admin;
Copy

要了解有关 Snowflake 权限模型的更多信息,请参阅 访问控制概述访问控制权限

使用特定用户权限和次要角色来刷新动态表

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

例如,您可以授予用户一个主要角色以访问表,以及一个次要角色以访问虚拟仓库。然后,用户可以创建一个动态表,使用两个角色的组合权限进行操作,从而简化权限管理并增强数据操作的灵活性。

虽然 EXECUTE AS USER 选项允许在用户角色下刷新动态表,对这些动态表的所有其他操作都遵循标准权限模型。

关键用例

  • 管理多角色权限: 在用户具有次要角色的情况下,用户可以使用其主要角色和次要角色的组合权限创建和刷新动态表。此配置可确保刷新动态表的用户具有访问所有必需资源所需的权限,同时保持与现有基于角色的访问控制的一致性。

  • 精细的安全和治理控制: 用户可以使用其他选项配置可选的安全措施,例如 REQUIRE USER,除非指定了用户,否则动态表无法运行。

  • 所有操作的可追溯性: ​​所有在 EXECUTE AS USER 动态表上的刷新都将归属于配置的用户,而非 SYSTEM 用户。这种归属机制有助于为所有操作维护清晰的审计追踪记录。

访问控制

动态表的所属角色必须被授予对 EXECUTE AS USER 指定用户的 IMPERSONATE 权限,且该指定用户必须被授予任务的所属角色。如果 IMPERSONATE 权限被撤销,动态表刷新将失败,动态表可能会 自动暂停

当动态表刷新时,刷新会话的主要角色是动态表的所有者角色,用户的默认次要角色将被激活。用户将能够使用 USE ROLE 命令切换主要角色,并使用 USE SECONDARY ROLES 命令在刷新会话中调整次要角色。

跨产品注意事项

  • 数据掩码和行访问策略: 策略 – 例如,使用 CURRENT_USER() – 根据指定的用户和角色而不是 SYSTEM 用户来进行评估。

  • 复制和故障转移: 将用户名和角色名称复制到次要部署。

    如果用户或角色在次要部署中不可用,则该用户将被标记为 INVALID,而且在修复之前,刷新将失败。

    如果其余角色提供足够的权限,则在执行期间将跳过无效的次要角色。

示例

配置动态表以用户身份运行刷新

以下示例创建了一个以指定用户身份执行刷新的动态表,并将主要角色设置为动态表的所有者角色。使用用户设置的任意用户沿袭参数执行刷新。

如果未显式指定次要角色的选项,则默认刷新为用户的当前会话设置。

CREATE DYNAMIC TABLE my_dynamic_table
  [ EXECUTE AS USER my_user_name
    [ USE SECONDARY ROLES { ALL | NONE | (<role1>, <role2>, ... ) } ]
  ]
Copy

为现有动态表设置次要角色

以下示例将动态表配置为以指定用户身份执行。 如果未选择特定的次要角色,则刷新流程默认用于当前会话的活跃次要角色。如果动态表已设置为以特定用户身份执行,则此命令将更新配置,以执行 ALTER DYNAMIC TABLE 命令的用户身份执行该表。

执行此命令需要动态表的 OWNERSHIP 权限。

ALTER DYNAMIC TABLE my_dynamic_table SET
  EXECUTE AS USER my_user_name
  [ USE SECONDARY ROLES { ALL | NONE | (<role1>, <role2>, ... ) } ]
Copy

切换动态表,以 SYSTEM 用户的身份执行

以下示例将动态表恢复为由使用动态表的所有者角色的 SYSTEM 用户执行。

执行此命令需要动态表的 OWNERSHIP 权限。

ALTER DYNAMIC TABLE my_dynamic_table UNSET EXECUTE AS USER;
Copy

创建动态表的权限

要创建动态表,必须使用具有以下权限的角色:

权限

对象

CREATE DYNAMIC TABLE

计划在其中创建动态表的架构。

SELECT

计划为新动态表查询的现有表和视图。

USAGE

计划用于新动态表的数据库和架构。

计划用于刷新表的仓库。

备注

虽然您可以使用具有 USAGE 权限的辅助角色执行 CREATE DYNAMIC TABLE ... INITIALIZE = ON_SCHEDULE,但如果主角色缺少此权限,动态表将无法成功刷新,因此也不会初始化。

要创建依赖于另一个动态表的动态表,必须使用具有以下权限的角色:

权限

对象

SELECT

创建新的动态表时计划查询的动态表。

OPERATE

新动态表依赖的所有上游动态表。只有在创建动态表时设置为同步刷新时才需要。

查询动态表的权限

要查询动态表,可以使用具有 创建动态表权限 的角色。对于用户(例如数据分析师)只需查询动态表的情况,可使用具有以下权限的角色:

权限

对象

USAGE

包含动态表的数据库和架构。

用于运行查询的仓库。

SELECT

查询的动态表。

更改动态表的权限

要更改动态表,必须使用拥有该动态表的 OWNERSHIP 或 OPERATE 权限的角色。

如果拥有动态表的 OPERATE 权限,可以使用 ALTER DYNAMIC TABLE 命令执行以下操作:

如果您拥有动态表的 OWNERSHIP 权限,则除了上面列出的操作外,还可以执行以下操作:

查看动态表元数据的权限

要查看元数据,必须使用具有该动态表 MONITOR 权限的角色。

对于用户只需要查看动态表的元数据和 Information Schema 的情况(例如,数据科学家持有的角色),请使用对该动态表具有 MONITOR 权限的角色。虽然 OPERATE 权限授予了这一访问权限,但它也包括更改动态表的功能,因此 MONITOR 更适合用户不需要更改动态表的情况。

如果拥有动态表的 MONITOR 权限,则可以执行以下操作:

  • 使用 DESCRIBE DYNAMIC TABLE 命令和 Snowsight 动态表详细信息页面查看动态表的具体详细信息。如果只拥有动态表的 SELECT 权限,则以下字段会隐藏:textwarehousescheduling_statelast_suspended_onsuspend_reason_code (仅限 UI)。

  • 使用 SHOW DYNAMIC TABLES 命令查看可以访问哪些动态表。

  • 调用 DYNAMIC_TABLE_GRAPH_HISTORY 表函数,查看图表历史记录。

  • 调用 DYNAMIC_TABLE_REFRESH_HISTORY 表函数,查看刷新历史记录。

删除动态表的权限

要删除动态表,必须使用具有该动态表 OWNERSHIP 权限的角色。

使用双仓库的权限

使用 INITIALIZATION_WAREHOUSE 所需的所有权限要求与 WAREHOUSE 相同。

操作

权限

使用 INITIALIZATION_WAREHOUSE 的 CREATE DYNAMIC TABLE

两个数据仓库的 CREATE DYNAMIC TABLE 和 USAGE,即 WAREHOUSE 和 INITIALIZATION_WAREHOUSE。

ALTER DYNAMIC TABLE ... SET / UNSET INITIALIZATION_WAREHOUSE

动态表的 OWNERSHIP 或 OPERATE,以及适用仓库的 USAGE。

使用 INITIALIZATION_WAREHOUSE 的动态表的 ALTER DYNAMIC TABLE ... REFRESH

动态表的 OPERATE,以及适用仓库的 USAGE。

有关更多信息,请参阅 了解动态表的仓库使用情况