GRANT OWNERSHIP¶
将架构中指定类型的某个对象或所有对象的所有权从一个角色转让给另一个角色。角色 是指角色或数据库角色。
OWNERSHIP 是一种特殊类型的权限,只能由一个角色授予另一个角色;不能撤消。有关更多详细信息,请参阅 访问控制概述。
此命令是 GRANT <privileges> 的变体。
- 另请参阅:
语法¶
-- Role
GRANT OWNERSHIP
{ ON { <object_type> <object_name> | ALL <object_type_plural> IN { DATABASE <db_name> | SCHEMA <schema_name> } }
| ON FUTURE <object_type_plural> IN { DATABASE <db_name> | SCHEMA <schema_name> }
}
TO ROLE <role_name>
[ { REVOKE | COPY } CURRENT GRANTS ]
-- Database role
GRANT OWNERSHIP
{ ON { <object_type> <object_name> | ALL <object_type_plural> IN { DATABASE <db_name> | SCHEMA <schema_name> } }
| ON FUTURE <object_type_plural> IN { DATABASE <db_name> | SCHEMA <schema_name> }
}
TO DATABASE ROLE <database_role_name>
[ { REVOKE | COPY } CURRENT GRANTS ]
必填参数¶
object_name
指定要转让所有权的对象的标识符。
object_type
指定对象的类型。
AGGREGATION POLICY
ALERT
AUTHENTICATION POLICY
COMPUTE POOL
DATA METRIC FUNCTION
DATABASE
DATABASE ROLE
DYNAMIC TABLE
EVENT TABLE
EXTERNAL TABLE
EXTERNAL VOLUME
FAILOVER GROUP
FILE FORMAT
FUNCTION
GIT REPOSITORY
HYBRID TABLE
ICEBERG TABLE
IMAGE REPOSITORY
INTEGRATION
MATERIALIZED VIEW
NETWORK POLICY
NETWORK RULE
PACKAGES POLICY
PIPE
PROCEDURE
MASKING POLICY
PASSWORD POLICY
PROJECTION POLICY
REPLICATION GROUP
ROLE
ROW ACCESS POLICY
SCHEMA
SESSION POLICY
SECRET
SEQUENCE
SNAPSHOT
STAGE
STREAM
TABLE
TAG
TASK
USER
VIEW
WAREHOUSE
object_type_plural
object_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> 和
CASCADE
来撤消权限,这样不会递归撤消这些以前依赖的授权。必须明确撤消授权。此参数要求执行 GRANT OWNERSHIP 命令的角色具有 MANAGE GRANTS 账户的权限。
默认值:None。不会对任何现有的出站权限执行这两项操作。
备注
如果既不撤消也不复制对象的现有出站权限,则 GRANT OWNERSHIP 语句将失败。
使用说明¶
您无法为以下对象转让 OWNERSHIP 权限:
APPLICATION ROLE
CONNECTION
只有 ACCOUNTADMIN 角色具有连接对象的 OWNERSHIP 权限。
SERVICE
SHARE
具有 MANAGE GRANTS 权限的角色可以将对象的所有权转让给任何角色;相反,没有 MANAGE GRANTS 权限的角色只能将所有权从自身转让给角色层次结构中的子角色。
如果对象存在出站(即从属)权限,则 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
语句。您不能转让共享的 OWNERSHIP 权限,也不能转让连接的 OWNERSHIP 权限。只有 ACCOUNTADMIN 角色才能拥有连接。
要授予动态表的 OWNERSHIP 权限,请确保接收角色对包含动态表的数据库和架构以及用于刷新表的仓库具有 USAGE 权限。否则,后续的计划刷新将失败。
要授予对未来动态表的 OWNERSHIP 权限,请执行以下步骤:
数据库角色:
只能转让与数据库角色位于同一数据库的对象的所有权。
在转让对外部表或其父数据库的所有权时,通过将
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;
数据库角色¶
只需一个步骤,即可撤消对 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;