【发布时间】: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