Secure Data Sharingの開始

Secure Data Sharingは、非常に強力で使いやすい機能です。わずか数ステップでデータプロバイダーとして開始できます。

このトピックでは、共有を作成することで、データベースとそのオブジェクトを1つ以上のアカウントと共有するために必要なタスクを紹介します。直接共有またはリストを使用して、コンシューマーに共有を提供できます。

このトピックの内容:

データベースオブジェクトの共有方法の選択

続行する前に、オブジェクトを共有に追加するための次のオプションから、ニーズに最も適しているものを決定します。

  • オプション1。共有にデータベースロールを付与する。

    データベース内に複数のデータベースロールを共有に作成することにより、共有内のセキュリティ保護可能なオブジェクトをセグメント化します。データベース内のオブジェクトのサブセットに対する権限を各データベースロールに付与します。次に、各データベースロールを共有に付与します。

    データベースロールを含む共有からデータベースを作成した後、データコンシューマーは、各共有データベースロールを自分のアカウントにある1つ以上の アカウントロール に付与します。

    データベースロールがない場合、データコンシューマーアカウントのアカウント管理者は、単一の権限 IMPORTED PRIVILEGES をロールに付与して、ユーザーが共有内の すべての データベースおよびデータベースオブジェクト(テーブル、セキュアビューなど)にアクセスできるようにします。データコンシューマーアカウント内のさまざまなユーザーグループを、共有オブジェクトのサブセットにアクセスできるようにするオプションはありません。このオールオアナッシングアプローチでは、複数の共有を作成して、同じデータベース内の異なるオブジェクトへのアクセス権を付与する必要があります。

    注釈

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

    または、オプション1と2の両方をブレンドした共有を作成できます。つまり、データベースロールを共有に付与することができます(オプション1)が、これらのオブジェクトに対する権限をデータベースロールに付与せずに、オブジェクトに対する権限を同じ共有に直接付与することもできます(オプション2)。共有からデータベースを作成するデータコンシューマーは、データベースに対する IMPORTED PRIVILEGES 権限をローカルロールに付与することで、後者のオブジェクトにアクセスできます。

    ちなみに

    共有データベースロールは、オブジェクトに対する将来の付与をサポートしません。詳細については、 GRANT DATABASE ROLE ... TO SHARE をご参照ください。

  • オプション2。オブジェクトに対する権限を共有に直接付与する。

    データベース内の特定のオブジェクトに対する権限を共有に直接付与します。このオプションを使用すると、複数のデータベースが同じアカウントに属している限り、共有内にある複数のデータベースからのオブジェクト(例: テーブルやセキュアビュー)を含めることができます。

    データコンシューマーアカウントのアカウント管理者は、共有データベースに対する IMPORTED PRIVILEGES 権限を1つ以上のロールに付与して、ユーザーが共有内のデータベースおよびデータベースオブジェクト(テーブル、セキュア ビューなど)にアクセスできるようにします。

    このオプションは、ロールに基づく共有内のデータベースオブジェクトのセグメント化をサポートしていないことに注意してください。このレベルの制御については、オプション1をご参照ください。

オプション1: 共有へのデータベースロールの付与

このセクションでは、データプロバイダーがデータベースロールを使用して、共有内のデータベースおよびデータベースオブジェクトへのアクセスを制限する手順について説明します。

注釈

このトピックで説明されているタスクを実行するには、ロールに CREATE DATABASE および CREATE SHARE のグローバル権限が必要です。

このセクション全体の拡張例では、データプロバイダーは次のオブジェクトをデータコンシューマーと共有します。

データベース

d1

スキーマ

d1.s1

セキュアビュー

d1.s1.v1

このビューの結果セットには、テーブル d1.s1.t1 の記録が含まれています。

d1.s1.v2

このビューの結果セットには、テーブル d1.s1.t2d1.s1.t3 の記録が含まれています。

データプロバイダーは、データベース d1 に2つのデータベースロールを作成して、これらのオブジェクト d1.r1d1.r2 へのアクセスを制御します。

次の図は、これらのオブジェクト間の関係を表し、データベースロールに付与される権限を示しています。

Data sharing with database roles example

権限の詳細については、 アクセス制御権限 をご参照ください。

ステップ1: データベースのロールを作成する

新しいデータベースロールを作成するか、 CREATE DATABASE ROLE を使用して既存のデータベースロールを置き換えます。

たとえば、完全修飾識別子を使用してデータベースロール d1.r1d1.r2 を作成します。

CREATE DATABASE ROLE d1.r1;

CREATE DATABASE ROLE d1.r2;
Copy

または、目的のデータベースをセッションの現在のデータベースとして設定し、データベースロールを作成します。

USE DATABASE d1;

CREATE DATABASE ROLE r1;

CREATE DATABASE ROLE r2;
Copy

ステップ2: オブジェクトに対する権限をデータベースロールに付与する

GRANT <権限> を使用して、単一のデータベースとデータベース内のオブジェクトのサブセットに対する権限を各データベースロールに付与します。データベースロールがアクセス権を付与する必要があるオブジェクトのみに権限を付与します。

データベースロールの完全修飾名を指定するか、データベースをセッションでアクティブなデータベースとして設定してから、相対名を指定します。

注釈

  • このトピックで説明されているタスクを実行するには、 ACCOUNTADMIN ロール、または 関連する権限を付与されたロール を使用する必要があります。追加のデータ共有シナリオを含む詳細については、 共有の操作 をご参照ください。

  • データベースロールに付与される権限は、データベースロールと、同じデータベース内の他のオブジェクトに対する権限を含むデータベースおよびスキーマに対する USAGE に制限されています。特に、 REFERENCE_USAGE 権限をデータベースロールに付与して、複数のデータベースのオブジェクトを共有に含めることはできないことに注意してください。

これらの手順の拡張例を続けると、次の権限がデータベースロールに付与されます。

データベースロール

権限

オブジェクト

d1.r1

USAGE

データベース d1

USAGE

スキーマ d1.s1

SELECT

セキュアビュー d1.s1.v1

d1.r2

USAGE

データベース d1

USAGE

スキーマ d1.s1

SELECT

セキュアビュー d1.s1.v2

次の SQL ステートメントは、 d1.r1 データベースロールに権限を付与します。

GRANT USAGE ON SCHEMA d1.s1 TO DATABASE ROLE d1.r1;
GRANT SELECT ON VIEW d1.s1.v1 TO DATABASE ROLE d1.r1;
Copy

次の SQL ステートメントは、 d1.r2 データベースロールに権限を付与します。

GRANT USAGE ON SCHEMA d1.s1 TO DATABASE ROLE d1.r2;
GRANT SELECT ON VIEW d1.s1.v2 TO DATABASE ROLE d1.r2;
Copy

親データベースに対する USAGE 権限を付与する必要はないことに注意してください。この権限は、データベースロールの作成時に暗黙的に付与されます。

データベースロールに付与されたすべての権限を表示するには、完全修飾識別子を使用して SHOW GRANTS TO DATABASE ROLE を実行します。

SHOW GRANTS TO DATABASE ROLE d1.r1;
SHOW GRANTS TO DATABASE ROLE d1.r2;
Copy

または、目的のデータベースをセッションの現在のデータベースとして設定し、次のコマンドを実行します。

USE DATABASE d1;

SHOW GRANTS TO DATABASE ROLE r1;
SHOW GRANTS TO DATABASE ROLE r2;
Copy

ステップ3: 共有を作成する

CREATE SHARE を使用して共有を作成します。プロセスのこのステージでは、共有は空のコンテナーです。

たとえば、 share1 という名前の新しい共有を作成します。

CREATE SHARE share1;
Copy

ステップ4: 共有に USAGE 権限を付与してデータベースを追加する

現在、データベースを共有に含めるには、データベースに対する USAGE 権限を付与する必要があります。

たとえば、 d1 データベースに対する USAGE 権限を付与して、 share1 を共有します。

GRANT USAGE ON DATABASE d1 TO SHARE share1;
Copy

ステップ5: データベースのロールを共有に付与してオブジェクトを追加する

GRANT DATABASE ROLE ... TO SHARE を使用してデータベースロールを共有に付与することにより、データベースとデータベースオブジェクトを共有に追加します。

たとえば、 share1 を共有するためにデータベースロール d1.r1d1.r2 を付与します。

GRANT DATABASE ROLE d1.r1 TO SHARE share1;
GRANT DATABASE ROLE d1.r2 TO SHARE share1;
Copy

ステップ6: データベースオブジェクトを1つ以上のデータコンシューマーアカウントと共有する

共有 ALTER SHARE ... ADD ACCOUNTS を変更し、データベースオブジェクトを共有するデータベースコンシューマーアカウントを追加します。

次の例では、組織 org1 にアカウント consumer1consumer2 を追加して share1 を共有します。

ALTER SHARE share1 ADD ACCOUNTS = org1.consumer1,org1.consumer2;
Copy

データベースロールの管理

このセクションでは、共有に付与されたデータベースロールを管理する手順について説明します。

データプロバイダー: 共有データベースロールの名前変更

ALTER DATABASEROLE ... RENAME TO ステートメントを使用してデータベースロールの名前を変更します。

たとえば、データベースロール d1.r1 の名前を d1.r3 に変更します。

ALTER DATABASE ROLE d1.r1 RENAME TO d1.r3;
Copy

d1.r1 に付与されたすべての権限は、データベースロールの名前が変更された後も保持されます。

データベースロールの名前が変更されたことを共有のデータコンシューマーに通知します。

RENAME TO 句を使用してデータベースロールを別のデータベースに移動することは禁止されていることに注意してください。例:

ALTER DATABASE ROLE d1.r1 RENAME TO d2.r1;
Copy

データプロバイダー: 共有データベースロールのドロップ

DROP DATABASE ROLE を使用してデータベースロールをドロップします。

たとえば、データベースロール d1.r2 をドロップします。

DROP DATABASE ROLE d1.r2;
Copy

データベースロールを含む共有のデータコンシューマーに通知します。データベースロールに付与されたすべてのオブジェクトへのアクセスが取り消されます。

データプロバイダー: 新しい共有データベースロールの作成

CREATE DATABASE ROLE を使用して新しいデータベースロールを作成します。詳細については、 ステップ1: データベースのロールを作成する (このトピック内)をご参照ください。データベースオブジェクトに対する権限をデータベースロールに付与してから、データベースロールを共有に付与します。

新しいデータベースロールを含む共有のデータコンシューマーに通知します。新しいデータベースロールを自分のアカウントロールに付与して、それらのロールがデータベースロールに関連付けられたオブジェクトにアクセスできるようにする必要があります。

オプション2: 共有への権限の直接付与

このセクションでは、データプロバイダーが共有データベースに対する単一の権限を付与することで、コンシューマーが、共有内のすべてのデータベースおよびデータベースオブジェクトにアクセスできるようにするための手順を説明します。

ステップ1: 共有を作成する

CREATE SHARE を使用して共有を作成します。このステップでは、共有は単にオブジェクトとアカウントが追加されるのを待っているコンテナーです。

ステップ2: 権限を付与してオブジェクトを共有に追加する

GRANT <権限> ... TO SHARE を使用して、共有に次のオブジェクト権限を付与します。

  • 共有するデータベースの USAGE 権限。

  • 共有するオブジェクトを含む各データベーススキーマに対する USAGE 権限。

  • 各共有スキーマで特定のオブジェクトを共有するための SELECT 権限。

    • テーブル

    • 外部テーブル

    • セキュアビュー

    • 安全なマテリアライズドビュー

    • 安全な UDFs

重要

異なる リージョン または クラウドプラットフォーム のデータコンシューマーと安全にデータを共有することを計画する場合、現在は、1つ以上の外部テーブルがデータベースに存在すると、プライマリデータベースの複製がブロックされることに注意してください。

注釈

ストリームにセキュアビューを作成し、それらのビューをコンシューマーと共有することはお勧めしません。代わりに、コンシューマーがテーブル上に独自のストリームを作成し、共有するビューを保護できるようにします。詳細については、 共有オブジェクトのストリーム をご参照ください。

必要に応じて、 SHOW GRANTS を使用して、共有のオブジェクト許可を表示します。

ちなみに

次の手順を完了すると、共有に追加されたすべてのアカウントに共有が表示されるため、この時点で共有のこの最小限の検証を実行します。

共有のより詳細な検証を実行するために、アカウント内のコンシューマーアカウントをシミュレートできます。詳細については、 セキュアオブジェクトを使用したデータアクセスの制御 をご参照ください。

ステップ3: 1つ以上のアカウントを共有に追加する

ALTER SHARE を使用して、共有に1つ以上のアカウントを追加します。共有に追加されたアカウントを確認するには、 SHOW GRANTS を使用できます。

指定したアカウントで共有を使用する準備が整いました。これらおよびその他のデータプロバイダータスクを実行するための詳細な手順については、 共有の操作 をご参照ください。

次の例は、上記のプロバイダープロセス全体を示しています。

この例では以下を前提としています。

  • aggregates_eula という名前のスキーマと aggregate_1 という名前のテーブルを持つ sales_db という名前のデータベースが存在。

  • データベース、スキーマ、およびテーブルは、 xy12345 および yz23456 という名前の2つのアカウントと共有。

USE ROLE accountadmin;

CREATE SHARE sales_s;

GRANT USAGE ON DATABASE sales_db TO SHARE sales_s;
GRANT USAGE ON SCHEMA sales_db.aggregates_eula TO SHARE sales_s;
GRANT SELECT ON TABLE sales_db.aggregates_eula.aggregate_1 TO SHARE sales_s;

SHOW GRANTS TO SHARE sales_s;

ALTER SHARE sales_s ADD ACCOUNTS=xy12345, yz23456;

SHOW GRANTS OF SHARE sales_s;
Copy