共有データの消費¶
このトピックでは、データプロバイダーによって利用可能になった共有からデータベースを作成し、データベースをクエリやその他の操作に使用することに関連するタスクについて説明します。
これらのタスクを実行するには、 ACCOUNTADMIN ロール(またはIMPORT SHARE グローバル権限が付与されたロール)を使用する必要があります。IMPORT SHARE 権限の詳細については、 ACCOUNTADMIN 以外のロールによる、データ共有タスクの実行の有効化 をご参照ください。
注釈
このトピックで説明されているタスクは、リーダーアカウントには適用されません。リーダーアカウントを使用して共有データを使用する場合、これらのタスクはプロバイダーアカウントの管理者によって既に完了しているため、これらのタスクを実行する必要はありません。
このトピックの内容:
共有データベースの一般的な制限¶
共有データベースには、利用者に対する次の制限があります。
共有データベースは読み取り専用です。コンシューマーアカウントのユーザーは、データを表示/クエリできますが、データの挿入または更新、またはデータベースへのオブジェクトの作成はできません。
次のアクションはサポートされていません。
共有データベースまたはデータベース内のスキーマ/テーブルのクローンの作成。
共有データベースまたはデータベース内のスキーマ/テーブルのTime Travel。
共有データベースのコメントの編集。
共有データベースおよびデータベース内のすべてのオブジェクトは他のアカウントとは再共有できません。
共有データベースは複製できません。
利用可能な共有の表示¶
ウェブインターフェイスまたは SQL を使用して、アカウントで使用できる共有を表示できます。
- Snowsight:
Data Products » Private Sharing を選択してから、 Shared With You を選択します。各インスタンスについて、次を表示できます。
自分と共有された 非公開の共有リスト。アクセスできる Data exchange リストを表示することもできます。
ユーザーと共有された 直接共有。共有のステータスに応じて、共有は2つのセクションにグループ化されます。
取得する準備ができている直接共有(つまり、共有から作成されていないデータベース)。
データベースにインポートされ、クエリを実行する準備ができている直接共有。
データベースにインポートされ、クエリの準備が整った Snowflake Marketplace リストを表示するには、ナビゲーションメニューで Data Products » Marketplace を選択します。詳細については、 リストの検索 をご参照ください。
- Classic Console:
Shares を選択してから、 Inbound トグルを選択します。
このページには、アカウントで使用可能なすべての共有が表示されます。 Database 列には、共有から作成されたデータベースの名前が表示されます。列が空の場合、データベースはまだ共有から(アカウント内に)作成されていません。
- SQL:
SHOW SHARES または DESCRIBE SHARE ステートメントを実行します。
例えば、 SQLを使用する場合:
SHOW SHARES;
Copy出力は次のとおりです。
2つの共有、
sales_s
およびsales_s2
が利用可能です。kind
列のINBOUND
は、データプロバイダーがアカウントで共有を利用できるようにしたことを示しています。name
列には、各共有の名前がshare_name
(例:SALE_S
)の形式で表示されます。owner_account
列には、各共有を提供したアカウント名がorgname.account_name
の形式で表示されます。database_name
列が空の場合、データベースはまだ共有からアカウント内に作成されていません。
+-------------------------------+----------+----------------------+---------------+-----------------------+------------------+--------------+----------------------------------------+---------------------+ | created_on | kind | owner_account | name | database_name | to | owner | comment | listing_global_name | | |-------------------------------+----------+----------------------+---------------+-----------------------+------------------+--------------+----------------------------------------|---------------------| | 2017-07-09 19:18:09.821 -0700 | INBOUND | SNOW.XY12345 | SALES_S2 | UPDATED_SALES_DB | | | Transformed and updated sales data | | | 2017-06-15 17:02:29.625 -0700 | OUTBOUND | SNOW.MY_TEST_ACCOUNT | SALES_S | SALES_DB | XY12345, YZ23456 | ACCOUNTADMIN | | | +-------------------------------+----------+----------------------+---------------+-----------------------+------------------+--------------+----------------------------------------+---------------------+
次の例では、 DESCRIBE SHARE コマンドを使用して、 sales_s
共有にあるオブジェクト(データベース、スキーマ、およびテーブル)を表示します。
DESC SHARE xy12345.sales_s; +----------+------------------------------------+---------------------------------+ | kind | name | shared_on | |----------+------------------------------------+---------------------------------| | DATABASE | <DB> | Thu, 15 Jun 2017 17:03:16 -0700 | | SCHEMA | <DB>.AGGREGATES_EULA | Thu, 15 Jun 2017 17:03:16 -0700 | | TABLE | <DB>.AGGREGATES_EULA.AGGREGATE_1 | Thu, 15 Jun 2017 17:03:16 -0700 | | VIEW | <DB>.AGGREGATES_EULA.AGGREGATE_1_v | Thu, 15 Jun 2017 17:03:16 -0700 | +----------+------------------------------------+---------------------------------+Copy共有は、1つのスキーマ
aggregates_eula
と1つのテーブルaggregate_1
で構成されています。データベース自体を含む各オブジェクト名の先頭には<DB>
が付いています。これは、データベースが共有から(アカウント内に)まだ作成されていないことを示します。
共有からのデータベースの作成¶
ウェブインターフェイスまたは SQL を使用して、共有からデータベースを作成できます。
- Snowsight:
Snowsight にサインインします。
Data Products » Private Sharing を選択します。
Shared with You タブを選択します。
Ready to Get セクションで、データベースを作成する共有を選択します。
データベース名とデータベースへのアクセスを許可するロールを設定します。
Get Data を選択します。
- Classic Console:
- SQL:
次のデータ共有固有の構文を使用して CREATE DATABASE ステートメントを実行します。
CREATE DATABASE <name> FROM SHARE <provider_account>.<share_name>
Copyprovider_account
は共有を提供したアカウントの名前で、share_name
はデータベースを作成した元の共有の名前です。
注釈
共有は、アカウントごとに1回のみ使用できます。
データベースを作成する前に共有されているオブジェクトを確認するには、 DESCRIBE SHARE コマンドを使用します。
データベースが共有から作成される場合、デフォルトでは、データベースの作成に使用されたロールのみがデータベース内のオブジェクトにアクセスできます。他のロールにアクセス権を付与する手順については、 共有データベースに対する権限の付与 (このトピック内)をご参照ください。
SQL 例¶
次の例では、アカウントに sales_s
共有から snow_sales
という名前の新しいデータベースを作成します。
CREATE DATABASE snow_sales FROM SHARE xy12345.sales_s;Copy
新しい snow_sales
データベースをリストします。
SHOW DATABASES LIKE 'snow%'; +---------------------------------+-----------------------+------------+------------+-------------------------+--------------+---------+---------+----------------+ | created_on | name | is_default | is_current | origin | owner | comment | options | retention_time | |---------------------------------+-----------------------+------------+------------+-------------------------+--------------+---------+---------+----------------| | Sun, 10 Jul 2016 23:28:50 -0700 | SNOWFLAKE_SAMPLE_DATA | N | N | SFC_SAMPLES.SAMPLE_DATA | ACCOUNTADMIN | | | 1 | | Thu, 15 Jun 2017 18:30:08 -0700 | SNOW_SALES | N | Y | xy12345.SALES_S | ACCOUNTADMIN | | | 1 | +---------------------------------+-----------------------+------------+------------+-------------------------+--------------+---------+---------+----------------+Copyこの例では、
origin
列は、データベースが作成された共有の完全修飾名を示しています。
同様に、 SHOW SHARES および DESC SHARE の出力には、共有から作成されたデータベースの名前が含まれます。
SHOW SHARES;Copy+-------------------------------+----------+----------------------+---------------+-----------------------+------------------+--------------+----------------------------------------+---------------------+ | created_on | kind | owner_account | name | database_name | to | owner | comment | listing_global_name | |-------------------------------+----------+----------------------+---------------+-----------------------+------------------+--------------+----------------------------------------|---------------------| | 2017-07-09 19:18:09.821 -0700 | INBOUND | SNOW.XY12345 | SALES_S2 | UPDATED_SALES_DB | | | Transformed and updated sales data | | | 2017-06-15 17:02:29.625 -0700 | OUTBOUND | SNOW.MY_TEST_ACCOUNT | SALES_S | SALES_DB | XY12345, YZ23456 | ACCOUNTADMIN | | | +-------------------------------+----------+----------------------+---------------+-----------------------+------------------+--------------+----------------------------------------+---------------------+DESC SHARE xy12345.sales_s; +----------+------------------------------------------+---------------------------------+ | kind | name | shared_on | |----------+------------------------------------------+---------------------------------| | DATABASE | SNOW_SALES | Thu, 15 Jun 2017 17:03:16 -0700 | | SCHEMA | SNOW_SALES.AGGREGATES_EULA | Thu, 15 Jun 2017 17:03:16 -0700 | | TABLE | SNOW_SALES.AGGREGATES_EULA.AGGREGATE_1 | Thu, 15 Jun 2017 17:03:16 -0700 | | VIEW | SNOW_SALES.AGGREGATES_EULA.AGGREGATE_1_v | Thu, 15 Jun 2017 17:03:16 -0700 | +----------+------------------------------------------+---------------------------------+Copy
共有データベースでの権限の付与¶
共有内のオブジェクトへのアクセス権を付与する手順は、プロバイダーがデータベースロールを使用して共有内のオブジェクトをセグメント化したかどうかによって異なります。このオプションは、共有内のさまざまなオブジェクトをさまざまなデータベースロールに関連付けます。
単一の共有には、データベースロールを介してアクセスできるオブジェクトと、データベースロールに関連付けられていないオブジェクトの両方を含めることができることに注意してください。
オプション1: データベースロールに関連付けられていない共有内のオブジェクト¶
アカウント内の1つ以上のロールに共有データベースに対する IMPORTED PRIVILEGES 権限を付与して、ユーザーが共有内のオブジェクトにアクセスできるようにします。
ロールは、次のいずれかの場合にのみ、インポートされたデータベースで IMPORTED PRIVILEGES を付与できます。
インポートされたデータベースを所有する(つまり、データベースに対する OWNERSHIP 権限を有する)場合。
MANAGE GRANTS グローバル権限が付与された場合。
IMPORTED PRIVILEGES の他のロールへの割り当て¶
ウェブインターフェイスまたは SQL を使用して、このロールを他のロールに割り当てることができます。
- Classic Console:
Databases » <共有データベース名> をクリックします。
サイドパネルで Grant Privileges をクリックし、1つ以上のロールに権限を割り当てます。
- SQL:
GRANT <権限> ステートメントを実行します。
共有データベースで USAGE 権限を持つロールを表示するには、ウェブインターフェイスまたは SHOW GRANTS コマンドを使用します。
SQL 例¶
ロール
r1
は、共有xy12345.sales_s
からデータベースsnow_sales
を作成します。use role r1; create database snow_sales from share xy12345.sales_s;
Copyロール
r1
が、データベースsnow_sales
の IMPORTED PRIVILEGES をロールr2
に付与します。grant imported privileges on database snow_sales to role r2;
Copyr2
にはデータベースに対する OWNERSHIP 権限がないため、次の許可または取り消し操作のいずれかを実行できるように、ロールr2
はアカウントに対する MANAGE GRANTS 権限を保持する必要があります。use role r2; grant imported privileges on database snow_sales to role r3; revoke imported privileges on database snow_sales from role r3;
Copy
オプション2: データベースロールに関連付けられた共有内のオブジェクト¶
共有データベースの適切なデータベースロールをアカウントの1つ以上のロールに付与して、ユーザーが共有内のオブジェクトにアクセスできるようにします。
ステップ1: 共有からデータベースを作成する¶
CREATE DATABASE ... FROM SHARE を使用して、共有からデータベースを作成します。
このコマンドを実行するには、 CREATE DATABASE および IMPORT SHARE のグローバル権限を持つロールが必要です。
たとえば、プロバイダー provider1
からデータベース c1
を作成し、 share1
を共有します。
CREATE DATABASE c1 FROM SHARE provider1.share1;
ステップ2: 共有データベースのロールをアカウントレベルのロールに付与する¶
アカウント内のロールに共有データベースロールを付与して、それらのロールを持つユーザーが共有内のデータベースオブジェクトにアクセスできるようにします。
共有からデータベースを作成するために使用したロールを使用します。
たとえば、利用可能なデータベースロールを参照し、データベースロール c1.r1
をアカウントの analyst
ロールに付与します。
SHOW DATABASE ROLES in DATABASE c1;
GRANT DATABASE ROLE c1.r1 TO ROLE analyst;
共有ビューまたは共有テーブルでのストリームの作成¶
共有オブジェクト(セキュアビューまたはテーブル)にストリームを作成すると、それらのオブジェクトで行われたデータ操作言語(DML)の変更を追跡できます。この機能は、「ローカル」オブジェクト(つまり、ストリームと同じアカウント)でのストリームの作成と使用に似ています。
このセクションの SQL ステートメントを実行するために使用されるロールには、共有テーブルまたはセキュアビューで必要な権限が付与されている必要があります。詳細については、 共有データベースでの権限の付与 (このトピック内)をご参照ください。
共有ビューでストリームを作成するには、
CREATE STREAM <name> ON VIEW <shared_db>.<schema>.<view>;
Copyたとえば、
snow_sales.aggregates_eula
データベースとスキーマのaggregate_1_v
共有ビューにテーブルストリームを作成します。CREATE STREAM aggregate_1_v_stream ON VIEW snow_sales.aggregates_eula.aggregate_1_v;
Copy共有テーブルでストリームを作成するには、
CREATE STREAM <name> ON TABLE <shared_db>.<schema>.<table>;
Copy例えば、
snow_sales.aggregates_eula
データベースとスキーマの共有aggregate_1
テーブルにテーブルストリームを作成します。CREATE STREAM aggregate_1_stream ON TABLE snow_sales.aggregates_eula.aggregate_1;
Copy
ストリームの作成の詳細については、 CREATE STREAM をご参照ください。
注釈
データプロバイダーは、これらのオブジェクトにストリームを作成する前に、ビューまたはテーブルの変更追跡を有効にする必要があります。目的の共有オブジェクトでストリームを作成できない場合は、データプロバイダーに連絡して、オブジェクトで変更の追跡を有効にすることを検討します。
ストリームが古くなるのを防ぐには、テーブルの保持期間中にトランザクション内でストリーム記録を消費します。データプロバイダーに連絡して、テーブルのデータ保持期間を確認してください。
ストリームが古くなったかどうかを判断するには、 DESCRIBE STREAM または SHOW STREAMS コマンドを実行します。コマンド出力で、 STALE 列の値が TRUE の場合、ストリームが古くなっている可能性があります。実際には、ストリームからの読み取りは、予想される STALE_AFTER の後しばらくの間成功する可能性があります。ただし、この期間中はいつでもストリームが古くなる可能性があります。
共有データベースのクエリ¶
共有データベースのクエリは、アカウント内の他のデータベースのクエリと同じです。
例:
USE ROLE r1; USE DATABASE snow_sales; SELECT * FROM aggregates_1;Copy