GRANT OWNERSHIP¶
将架构中指定类型的某个对象或所有对象的所有权从一个角色转让给另一个角色。角色 是指角色或数据库角色。
OWNERSHIP 是一种特殊类型的权限,只能由一个角色授予另一个角色;不能撤销。有关更多详细信息,请参阅 访问控制概述。
此命令是 GRANT <privileges> ... TO ROLE 的变体。
语法¶
对于不是类的实例的对象类型:
GRANT OWNERSHIP
{ ON {
<object_type> <object_name>
| ALL <object_type_plural> IN { DATABASE <database_name> | SCHEMA <schema_name> }
}
| ON FUTURE <object_type_plural> IN { DATABASE <database_name> | SCHEMA <schema_name> }
}
TO { ROLE <role_name> | DATABASE ROLE <database_role_name> }
[ { REVOKE | COPY } CURRENT GRANTS ]
对于类的实例:
GRANT OWNERSHIP
ON <class_name> <instance_name>
TO { ROLE <role_name> | DATABASE ROLE <database_role_name> }
[ { REVOKE | COPY } CURRENT GRANTS ]
必填参数¶
object_name指定要转让所有权的对象的标识符。
object_type指定对象的类型。
以下其中一项:
AGENTAGGREGATION POLICYALERTAUTHENTICATION POLICYCOMPUTE POOLCORTEX SEARCH SERVICEDATA METRIC FUNCTIONDATABASEDATABASE ROLEDBT PROJECTDYNAMIC TABLEEVENT TABLEEXTERNAL TABLEEXTERNAL VOLUMEFAILOVER GROUPFILE FORMATFUNCTIONGIT REPOSITORYICEBERG TABLEIMAGE REPOSITORYINTEGRATIONJOIN POLICYMASKING POLICYMATERIALIZED VIEWNETWORK POLICYNETWORK RULENOTEBOOKPACKAGES POLICYPASSWORD POLICYPIPEPRIVACY POLICYPROCEDUREPROJECTION POLICYREPLICATION GROUPRESOURCE MONITORROLEROW ACCESS POLICYSCHEMASEMANTIC VIEWSESSION POLICYSECRETSEQUENCESNAPSHOTSNAPSHOT POLICYSNAPSHOT SETSTAGESTREAMTABLETAGTASKUSERVIEWWAREHOUSE
object_type_pluralobject_type的复数形式(例如,TABLES、VIEWS)。请注意,不允许对管道和数据指标函数进行批量授权。
role_name获得对象所有权转让的角色的标识符。
database_role_name获得对象所有权转让的数据库角色的标识符。如果标识符不是完全限定的(以
db_name.database_role_name的形式),则该命令将在会话的当前数据库中查找数据库角色。所有权仅限于包含数据库角色的数据库中的对象。
可选参数¶
[ REVOKE | COPY ] CURRENT GRANTS指定在将所有权转让给新角色时,是移除还是转让对象的所有现有出站权限:
备注
出站 权限是指所有权变更的单个对象的任何权限。
转让角色的所有权时,当前授权涉及向其授予当前角色(以创建角色层次结构)的任何角色。如果在复制当前授权的同时转让角色的所有权,则 SHOW GRANTS 命令的输出会将新所有者视为当前角色的任何子角色的授予方。
REVOKE强制执行 RESTRICT 语义,这需要先移除对象的所有出站权限,然后才能将所有权转让给新角色。此要求旨在防止新所有角色不知不觉地继承已获得权限授予的对象。
转让所有权后,必须显式重新为角色授予对象权限。
请注意,向角色授予数据库或架构中指定类型的未来对象的所有权时(使用 GRANT OWNERSHIP ON FUTURE
<object_type>),REVOKE 关键字不起作用。COPY转让对象的所有权以及对象的任何现有出站权限的副本。转让之后,系统将新所有者标识为复制的出站权限的授权方(即,在对象的 SHOW GRANTS 输出中,新所有者在所有权限的 GRANTED_BY 列中列出)。因此,在所有权变更之前重新授予的任何权限不再依赖于原来的授权方角色。
结合使用 REVOKE <privileges> ... FROM ROLE 和
CASCADE来撤销权限,这样不会递归撤销这些以前依赖的授权。必须明确撤销授权。The
COPYparameter requires at least one of the following:An active role has the MANAGE GRANTS privilege on the account.
An active role is the new owner (or a higher) role. The system role PUBLIC is naturally captured by this requirement because PUBLIC is granted to every role.
The active role considers both primary and secondary roles. For more information, see 活动角色.
默认值:None。不会对任何现有的出站权限执行这两项操作。
备注
如果既不撤销也不复制对象的现有出站权限,则 GRANT OWNERSHIP 语句将失败。
使用说明¶
您无法为以下对象转让 OWNERSHIP 权限:
APPLICATION ROLECONNECTION只有 ACCOUNTADMIN 角色具有连接对象的 OWNERSHIP 权限。
类 的实例。
机器学习对象(即模型、模型版本和模型监控器)。
SERVICESHARE
如果对象存在出站(即从属)权限,则 GRANT OWNERSHIP 语句将被阻止。对象所有者(或更高角色)可以显式地将所有当前权限复制到新所有角色(使用
COPY CURRENT GRANTS选项),或者在转让所有权 之前,撤销对象上的所有出站权限(使用REVOKE CURRENT GRANTS选项)。对于角色对象,如果您未指定这些子句,则在将角色转让给新的所有者角色时,GRANT OWNERSHIP 语句不会被阻止。新的所有者角色已更新。但是,
SHOW GRANTS OF ROLE transferred_role命令显示向同一用户授予已转让角色的两行:在
granted_by列中,一行中的值面向原始所有者角色的授权。在
granted_by列中,另一行中的值面向新所有者角色的授权。
Snowflake 禁止对共享数据库执行 GRANT OWNERSHIP ...REVOKE CURRENT GRANTS 命令。有关详细信息,请参阅本主题中的 共享数据库 示例。
所有权的转让仅影响在发出命令时的现有对象。发出命令后创建的任何对象由创建对象时使用的角色所有。
除非满足其他条件,否则阻止转让以下类型的对象的所有权:
- 管道:
必须暂停管道。
- 任务:
您必须暂停计划任务。如果将指定数据库或架构中的所有任务转让给另一个角色,Snowflake 会自动暂停容器中的所有任务。使用
COPY CURRENT GRANTS选项转让给同一角色的任务也会自动暂停。有关更多信息,请参阅 任务安全性。
同时在数据库和架构级别定义 相同对象类型 的未来授权时,架构级授权优先于数据库级授权,并且忽略数据库级授权。
要授予物化视图的所有权,请使用
GRANT OWNERSHIP ON VIEW。没有单独的GRANT OWNERSHIP ON MATERIALIZED VIEW语句。要授予混合表的所有权,请使用
GRANT OWNERSHIP ON TABLE。没有单独的GRANT OWNERSHIP ON HYBRID TABLE语句。您不能转让共享的 OWNERSHIP 权限,也不能转让连接的 OWNERSHIP 权限。只有 ACCOUNTADMIN 角色可以拥有连接。
要授予动态表的 OWNERSHIP 权限,请确保接收角色对包含动态表的数据库和架构以及用于刷新表的仓库具有 USAGE 权限。否则,后续的计划刷新将失败。
要授予对未来动态表的 OWNERSHIP 权限,请执行以下步骤:
当您将 Apache Iceberg™ 表的所有权转让给其他角色时,Snowflake 不会转让对与表关联的外部卷(如果表是外部管理的,则还有目录集成)的 OWNERSHIP 权限。
要让目标角色完全控制表及其相关对象,您必须向该角色授予对外部卷和目录集成的 OWNERSHIP 权限。
After the ownership of a notebook is transferred to a new role, the original owner role loses all access to the notebook.
数据库角色:
只能转让与数据库角色位于同一数据库的对象的所有权。
在转让对外部表或其父数据库的所有权时,通过将
AUTO_REFRESH属性设置为FALSE,阻止表元数据的自动刷新。要在转让所有权后重置属性,请使用 ALTER EXTERNAL TABLE 命令。
示例¶
角色¶
在将所有权转让给 analyst 角色之前,撤销 manager 角色当前对 mydb 数据库的所有出站权限:
REVOKE ALL PRIVILEGES ON DATABASE mydb FROM ROLE manager; GRANT OWNERSHIP ON DATABASE mydb TO ROLE analyst; GRANT ALL PRIVILEGES ON DATABASE mydb TO ROLE analyst;请注意,此示例说明用于转让所有权的默认(和推荐的)多步骤流程。
只需一个步骤,即可撤销对 mydb.public 架构中现有表的所有权限,并将表的所有权(及其当前权限的副本)转让给 analyst 角色:
GRANT OWNERSHIP ON ALL TABLES IN SCHEMA mydb.public TO ROLE analyst COPY CURRENT GRANTS;
向 analyst 角色授予 mydb.public.mytable 表的所有权,以及表的所有当前出站权限的副本:
GRANT OWNERSHIP ON TABLE mydb.public.mytable TO ROLE analyst COPY CURRENT GRANTS;
Grant ownership on a notebook called mynotebook from the data_science role to the finance role:
USE ROLE data_science; GRANT OWNERSHIP ON NOTEBOOK db_one.schema_one.mynotebook TO ROLE finance;
数据库角色¶
只需一个步骤,即可撤销对 mydb.public 架构中现有表的所有权限,并将表的所有权(及其当前权限的副本)转让给 mydb.dr1 数据库角色:
GRANT OWNERSHIP ON ALL TABLES IN SCHEMA mydb.public TO DATABASE ROLE mydb.dr1 COPY CURRENT GRANTS;
向 mydb.dr1 数据库角色授予 mydb.public.mytable 表的所有权,以及表的所有当前出站权限的副本:
GRANT OWNERSHIP ON TABLE mydb.public.mytable TO ROLE mydb.dr1 COPY CURRENT GRANTS;