我喜欢 Snowflake 的零拷贝克隆功能,但它的一个属性似乎严重降低了它的便利性:
克隆创建者仅获得顶级克隆对象的所有权。子对象仍归原始子对象的所有者所有,新的顶级克隆所有者不一定有权更改其所有权。
我们有一个开发人员角色,可以读取我们的生产数据库。我想为开发人员提供一种方便的方法来创建他们完全拥有的生产克隆。
我能想到的唯一方法是创建一个所有者权限存储过程,由生产所有者拥有并可由开发人员角色调用,它克隆数据库,授予开发人员对新数据库及其所有模式的所有权,然后检索模式列表并遍历每个模式和每个模式对象类型,授予所有权:
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 权限,但它将继承所有对象级权限。
但是,要完全控制克隆数据库,帐户管理员应将克隆数据库的所有权授予分配给用户的角色。通过这种方式,用户可以拥有对源数据库的只读访问权限和克隆数据库的所有权。
因此,简短的回答似乎是默认情况下无法转让所有权。但是我仍然想知道是否有一种简单的方法可以转移所有子对象的所有权,假设您对它们具有使用/选择权限。