複数のデータベースのデータの共有

Snowflakeデータプロバイダーは、セキュアビューを使用して、異なるデータベースにあるデータを共有できます。セキュアビューは、同じアカウントに属している限り、1つ以上のデータベースからスキーマ、テーブル、その他のビューなどのオブジェクトを参照できます。

複数のデータベースのオブジェクトを参照するセキュアビューを共有するプロセスは、単一のデータベースにあるデータの共有とは少し異なります。

データを共有するためのすべての標準ステップを実行することに加えて、共有するセキュアビューによって参照される各データベースで REFERENCE_USAGE 権限を付与する必要があります。ただし、セキュアビューが作成されるデータベースに対する REFERENCE_USAGE を付与する必要はありません。

重要

複数のデータベースのオブジェクトを共有に含めるために、REFERENCE_USAGE 権限を データベースロール に付与することはできません。この制限は、別のデータベースに1つ以上の基になるテーブルを持つセキュアビューなどのオブジェクトにも適用されることに注意してください。

複数のデータベースを共有に含めるには、オブジェクトに対する権限を共有に直接付与する必要があります。このオプションの詳細については、 オプション2: 共有への権限の直接付与 をご参照ください。

ビューを共有に追加する前に、ビューで参照される各データベースに個別に権限を付与する必要があります(つまり、ビューの SELECT を共有に付与)。

複数のデータベースのオブジェクトを参照するセキュアビューを共有するには、

  1. ACCOUNTADMIN ロールまたは CREATE SHARES グローバル権限が付与されたロールを持つユーザーとしてSnowflakeアカウントに接続します。CREATE SHARES 権限の詳細については、 ACCOUNTADMIN 以外のロールによる、データ共有タスクの実行の有効化 をご参照ください。

  2. CREATE SHARE を使用して共有を作成します。

  3. GRANT <権限> ... TO SHARE を使用して共有するデータベースの USAGE 権限を付与します。

    注釈

    複数のデータベースに属するオブジェクトを参照するセキュアビューを共有している場合は、セキュアビューが作成されたデータベースにのみ USAGE 権限を付与する必要があります。共有ごとに1つのデータベースにのみ USAGE を付与できます。

  4. GRANT <権限> ... TO SHARE を使用して共有するデータベース内の各スキーマに USAGE 権限を付与します。

  5. GRANT <権限> ... TO SHARE を使用して共有するビューが参照するオブジェクトを含む追加の各データベースに REFERENCE_USAGE 権限を付与します。

  6. GRANT <権限> ... TO SHARE を使用して共有するビューの SELECT 権限を付与します。

  7. ALTER SHARE を使用して、1つ以上のコンシューマアカウントを共有に追加します。

指定したアカウントで共有を使用する準備が整いました。

例1

データとビジネスニーズの特性に基づいてデータをさまざまなデータベースに編成したプロバイダーは、あるデータベースのデータを他のデータベースのオブジェクト(例: スキーマ、テーブル、ビュー)と結合するセキュアビューを共有したいと考えています。

Relationship between databases, database objects, shares, and accounts

サンプルコード:

-- Sample database database1
CREATE DATABASE database1;
CREATE SCHEMA database1.sch;
CREATE TABLE database1.sch.table1 (id int);
CREATE VIEW database1.sch.view1 AS SELECT * FROM database1.sch.table1;

-- Sample database database2
CREATE DATABASE database2;
CREATE SCHEMA database2.sch;
CREATE TABLE database2.sch.table2 (id int);

-- Sample database to be shared
CREATE DATABASE database3;
CREATE SCHEMA database3.sch;

-- Create a table in the database to be shared.
CREATE TABLE database3.sch.table3 (id int);

-- Sample view to be shared.
-- This will require granting REFERENCE_USAGE on database1 and database2
CREATE SECURE VIEW database3.sch.view3 AS
SELECT view1.id AS View1Id, table2.id AS table2id, table3.id as table3id
FROM database1.sch.view1 view1,
     database2.sch.table2 table2,
     database3.sch.table3 table3;

CREATE SHARE Share1;
GRANT USAGE ON DATABASE database3 TO SHARE share1;
GRANT USAGE ON SCHEMA database3.sch TO SHARE share1;

GRANT REFERENCE_USAGE ON DATABASE database1 TO SHARE share1;
GRANT REFERENCE_USAGE ON DATABASE database2 TO SHARE share1;

GRANT SELECT ON VIEW database3.sch.view3 TO SHARE share1;
Copy

例2

プロバイダーは、顧客データを個別のデータベースに保存し、それらのデータベースに新しいオブジェクトを作成することを望みません。データを共有するために、プロバイダーはセキュアビューを持つ新しいデータベースを作成します。セキュアビューは、顧客データを使用してデータベース内のオブジェクト(スキーマ、テーブル、ビュー)を参照します。

Relationship between databases, database objects, shares, and accounts

サンプルコード:

-- Sample database customer1DB
CREATE DATABASE customer1DB;
CREATE SCHEMA customer1DB.sch;
CREATE TABLE customer1DB.sch.table1 (id int);
CREATE VIEW customer1DB.sch.view1 AS SELECT * FROM customer1DB.sch.table1;

-- Sample database customer2DB
CREATE DATABASE customer2DB;
CREATE SCHEMA customer2DB.sch;
CREATE TABLE customer2DB.sch.table2 (id int);

-- Sample database to be shared
CREATE DATABASE newDB;
CREATE SCHEMA newDB.sch;
-- Sample view to be shared
-- This will require granting REFERENCE_USAGE on customer1DB and customer2DB
CREATE SECURE VIEW newDB.sch.view3 AS
SELECT view1.id AS view1Id, table2.id AS table2ID
FROM customer1DB.sch.view1 view1,
   customer2DB.sch.table2 table2;

CREATE SHARE share1;
GRANT USAGE ON DATABASE newDB TO SHARE share1;
GRANT USAGE ON SCHEMA newDB.sch TO SHARE share1;

GRANT REFERENCE_USAGE ON DATABASE customer1DB TO SHARE share1;
GRANT REFERENCE_USAGE ON DATABASE customer2DB TO SHARE share1;

GRANT SELECT ON VIEW newDB.sch.view3 TO SHARE share1;
Copy