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();
}
}
しかし、クローンの所有者に自分のオブジェクトへの完全なアクセス権を与えるためだけに、これらすべてが本当に必要なのでしょうか? もっと簡単な方法があると思います。
編集:Snowflakeのサポートは次のように述べています:
...これは予期される動作です。たとえば、データベースへの読み取り専用アクセス権を持つ所有者 (ロール) がクローンを作成する場合、クローン化されたデータベースに対する USAGE 権限を持たないことを除いて、クローン化されたデータベースに対して同じアクセス権を持ちますが、すべてを継承します。オブジェクトレベルの権限。
ただし、複製されたデータベースを完全に制御するには、accountadmin が複製されたデータベースの所有権をユーザーに割り当てられたロールに付与する必要があります。このようにして、ユーザーはソース データベースへの読み取り専用アクセスと、複製されたデータベースの所有権を持つことができます。
したがって、短い答えは、デフォルトでは所有権を譲渡することはできないということです。しかし、使用/選択権限があると仮定して、すべての子オブジェクトの所有権を譲渡する簡単な方法があるかどうかを知りたいです。