【问题标题】:How to clone a Snowflake database and own all of its child objects?如何克隆雪花数据库并拥有其所有子对象?
【发布时间】:2021-12-31 01:19:49
【问题描述】:

我喜欢 Snowflake 的 zero-copy cloning 功能,但它的一个属性似乎严重降低了它的便利性:

克隆创建者仅获得顶级克隆对象的所有权。子对象仍为owned by the owner of the original child objects,新的顶级克隆所有者不一定有权更改其所有权。

我们有一个开发人员角色,对我们的生产数据库具有读取权限。我想为开发人员提供一种方便的方法来创建他们完全拥有的生产克隆。

我能想到的唯一方法是创建一个所有者权限存储过程,由生产所有者拥有并可由开发人员角色调用,它克隆数据库,授予开发人员对新数据库的所有权以及所有其架构,然后检索架构列表并遍历每个架构和每个架构对象类型,授予所有权:

snowflake.createStatement({sqlText: `create or replace transient database ${clone_db_name} clone ${prod_db_name}`}).execute();
snowflake.createStatement({sqlText: `grant ownership on database ${clone_db_name} to role ${role} revoke current grants`}).execute();

var schemas = [];
var result_set = snowflake.createStatement({sqlText: `show schemas in database ${clone_db_name}`}).execute();
while (result_set.next()) {
    var schema = result_set.getColumnValue('name');
    schemas.push(schema);
}

// All schema objects listed at:
// https://docs.snowflake.com/en/sql-reference/sql/grant-ownership.html
var object_types = [
    'TABLES', 'VIEWS', 'MATERIALIZED VIEWS', 'STAGES', 'FILE FORMATS', 'FUNCTIONS', 'PROCEDURES', 'SEQUENCES', 'STREAMS', 'TASKS'
]

for (const schema of schemas) {
    if (schema == 'INFORMATION_SCHEMA') {
        continue;
    }
    for (const object_type of object_types) {
        snowflake.createStatement({sqlText: `grant ownership on all ${object_type} in schema ${clone_db_name}.${schema} to role ${role} revoke current grants`}).execute();
    }
}

但是,为了让克隆所有者完全访问他们自己的对象,这一切真的有必要吗?我希望有更简单的方法。

编辑:雪花支持说:

...这是预期的行为。例如如果拥有者(角色)拥有 对数据库的只读访问,创建一个克隆,将具有相同的 对克隆数据库的访问权限,但它不会拥有 克隆数据库上的 USAGE 权限,但它将继承所有 对象级权限。

但是,要完全控制克隆的数据库,accountadmin 应将克隆数据库的所有权授予以下角色 分配给用户。这样,用户就可以拥有只读权限 到源数据库和克隆数据库的所有权。

因此,简短的回答似乎是默认情况下无法转让所有权。但我仍然想知道是否有一种简单的方法可以转移所有子对象的所有权,假设您对它们具有使用/选择权限。

【问题讨论】:

    标签: snowflake-cloud-data-platform database-permissions database-cloning


    【解决方案1】:

    如文档中所述: https://docs.snowflake.com/en/user-guide/object-clone.html#access-control-privileges-for-cloned-objects

    对于子对象,它们的权限将被复制:

    但是,如果源对象是数据库或模式,则对于子对象 源中包含的对象,克隆复制所有授予的 相应子对象的权限:

    • 对于数据库,包含的对象包括模式、表、视图等。
    • 对于模式,包含的对象包括表、视图等。

    这是为了防止克隆器通过克隆意外访问下划线对象。

    如果您的开发人员角色可以访问克隆的数据库或架构下的对象,那么他/她应该仍然可以访问克隆的子项。他/她不能仅仅因为他/她克隆了这些对象就拥有它们,因为这些对象可能会受到限制。

    【讨论】:

    • 好吧,有道理。所以基本上,您可能对某些原始子对象没有使用/选择权限,因此默认情况下不应该有权更改它们的克隆版本的权限。当您确实有权访问它们时,如果有一种简单的方法可以批量转让所有权,那就太好了。
    猜你喜欢
    • 2022-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多