GRANT OWNERSHIP

将架构中指定类型的某个对象或所有对象的所有权从一个角色转让给另一个角色。角色 是指角色或数据库角色。

OWNERSHIP 是一种特殊类型的权限,只能由一个角色授予另一个角色;不能撤消。有关更多详细信息,请参阅 访问控制概述

此命令是 GRANT <privileges> 的变体。

另请参阅:

REVOKE <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 ]
Copy

必填参数

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 的复数形式(例如,TABLESVIEWS)。

请注意,不允许对管道进行批量授权。

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 权限,请执行以下步骤:

    • 如果将动态表设置为在创建时初始化(即 INITIALIZE = ON_CREATE),请确保新角色对引用对象具有 足够的权限。否则,初始刷新将失败并导致错误,指明找不到对象。

    • 如果将动态表设置为在计划时初始化(即 INITIALIZE = ON_SCHEDULE),请确保新角色对引用对象具有 足够的权限。否则,后续的计划刷新将失败。

  • 数据库角色:

    只能转让与数据库角色位于同一数据库的对象的所有权。

  • 在转让对外部表或其父数据库的所有权时,通过将 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;
Copy

请注意,此示例说明用于转让所有权的默认(和推荐的)多步骤流程。

只需一个步骤,即可撤消对 mydb.public 架构中现有表的所有权限,并将表的所有权(及其当前权限的副本)转让给 analyst 角色:

GRANT OWNERSHIP ON ALL TABLES IN SCHEMA mydb.public TO ROLE analyst COPY CURRENT GRANTS;
Copy

analyst 角色授予 mydb.public.mytable 表的所有权,以及表的所有当前出站权限的副本:

GRANT OWNERSHIP ON TABLE mydb.public.mytable TO ROLE analyst COPY CURRENT GRANTS;
Copy

数据库角色

只需一个步骤,即可撤消对 mydb.public 架构中现有表的所有权限,并将表的所有权(及其当前权限的副本)转让给 mydb.dr1 数据库角色:

GRANT OWNERSHIP ON ALL TABLES IN SCHEMA mydb.public
  TO DATABASE ROLE mydb.dr1
  COPY CURRENT GRANTS;
Copy

mydb.dr1 数据库角色授予 mydb.public.mytable 表的所有权,以及表的所有当前出站权限的副本:

GRANT OWNERSHIP ON TABLE mydb.public.mytable
  TO ROLE mydb.dr1
  COPY CURRENT GRANTS;
Copy

共享数据库

要转让对共享数据库的 OWNERSHIP 权限,请使用以下命令:

REVOKE USAGE ON DATABASE mydb FROM SHARE myshare;
GRANT OWNERSHIP ON DATABASE mydb TO ROLE r2;
GRANT USAGE ON DATABASE mydb TO ROLE r2;
Copy

如有必要,请使用 GRANT <privilege> ...TO SHARE 命令,向共享重新授予数据库。

语言: 中文