Snowflake Native App でデータのコンテンツを共有する

このトピックでは、プロバイダーが共有データ・コンテンツを Snowflake Native App に追加する方法について説明します。

注釈

プロバイダーは、限定トライアルリストとして、 Snowflake Marketplace に Snowflake Native App を公開することができます。アプリをトライアルリストとして公開するには、 限定トライアルリストの準備 をご参照ください。

Snowflake Native App の共有データについて

Snowflake Native App Framework により、プロバイダーは共有データ・コンテンツをアプリに追加できます。このデータコンテンツは、消費者がアプリをインストールして使用する際に共有されます。データ・コンテンツを共有するためには、プロバイダーはアプリケーション・パッケージに共有データに関する権限を付与する必要があります。アプリケーションパッケージでプロバイダーが共有するデータコンテンツは、アプリにインストールされているすべてのインスタンスで共有されます。

注意

共有データコンテンツはバージョン管理されません。つまり、アプリのすべてのバージョンが同じデータを使用します。

コンシューマーは共有コンテンツに直接アクセスすることはできません。代わりに、プロバイダーはアプリケーションパッケージのセットアップスクリプトでセキュアビューを作成し、コンシューマーにセキュアビューへのアクセス権を付与します。詳細については、 共有オブジェクトにアクセスすることをコンシューマーに許可する をご参照ください。

共有できるデータベースオブジェクト

Snowflake Native App Framework により、プロバイダーは以下のデータベースオブジェクトをアプリケーションパッケージに追加できます。

  • スキーマ

  • 外部テーブルと Apache Iceberg™ テーブルを含むテーブル

  • ビュー

注釈

テーブルやビューなどのデータベースオブジェクトを共有する場合は、それらを含むスキーマも共有する必要があります。

アプリケーションパッケージで共有されるテーブルとビューには、以下の制限が適用されます。

  • テーブルには、Java、Python、または JavaScript のコードを含むポリシーなどの仮想列を持つことはできません。

  • ビュー定義またはポリシーなどの仮想列にJava、Python、または JavaScript への呼び出しを含めることはできません。

  • 共有テーブルは仮テーブル、揮発性テーブル、一時テーブルにはできません。

  • Cross-Cloud Auto-Fulfillmentは、外部テーブルまたは Apache Iceberg™ テーブルを含むアプリでは非対応です。

ポリシーを含むデータコンテンツの共有制限

また、 CURRENT_USER など、ポリシーによって一般的に参照されるいくつかの関数は、コンシューマーアカウントで作成されたアプリケーションオブジェクトのコンテキストで異なる動作をします。プロバイダーによって定義されたポリシーはプロバイダーのアカウントでは正しく動作しても、コンシューマーがアプリをインストールするときにはコンシューマーのアカウントで動作しない可能性があります。

Snowflakeでは、プロバイダーがセットアップスクリプトで指定されたプロキシビューにポリシーを定義することをお勧めします。プロキシビューにポリシーを定義することにより、アプリをインストールした後にポリシーの定義を変更できないようにします。また、プロキシビューにポリシーを定義することで、アップグレード中に実行中のコードが、バージョン作成時に適用されたポリシーを引き続き使用できるようになります。

アプリケーションパッケージに共有コンテンツの権限を付与する

アプリに共有データ コンテンツを含めるには、プロバイダーはアプリケーションパッケージと共有するオブジェクトに対する権限を付与する必要があります。プロバイダーがアプリケーションパッケージ内にオブジェクトを追加すると、デフォルトでは、そのオブジェクトがアプリケーションパッケージに対してプライベートになり、アプリのインストール時には表示されません。

アプリケーションパッケージからインストールされたオブジェクトをアプリに表示するには、次の例に示すように GRANT ... TO SHARE IN APPLICATION PACKAGE コマンドを使用します。

CREATE APPLICATION PACKAGE app_package;

GRANT USAGE ON SCHEMA app_package.shared_schema
  TO SHARE IN APPLICATION PACKAGE app_package;
GRANT SELECT ON TABLE app_package.shared_schema.shared_table
  TO SHARE IN APPLICATION PACKAGE app_package;
Copy

この例では、最初のコマンドが shared_schema スキーマに対する USAGE 権限をアプリケーションパッケージに付与し、コンシューマーと共有できるようにします。このコマンドにより、スキーマをコンシューマーと共有することができます。2番目のコマンドは、 shared_schema 内の shared_table テーブルに対する SELECT 権限をアプリケーションパッケージに付与します。このコマンドにより、コンシューマーはテーブルにクエリすることができます。

コンシューマーは、アプリケーションパッケージ app_package からアプリをインストールした後、 shared_schema にアクセスし、 shared_table をクエリできます。

注釈

アプリケーションパッケージに共有オブジェクトを追加する場合は、そのオブジェクトを含むスキーマも共有する必要があります。

同様の SQL コマンドを使用して、ビューをアプリケーションと共有することもできます。

アプリケーションパッケージ外のオブジェクトに権限を付与する

アプリケーション・パッケージの外部に存在するデータベース・オブジェクトを共有するには、プロバイダーはアプリケーション・パッケージ内にオブジェクトへのアクセスを許可するビューを作成する必要があります。アプリケーションパッケージの外部のオブジェクトを直接共有することはできません。

例えば、アプリケーション・パッケージの外部にあるデータベースを共有するには、次の例に示すように、アプリケーション・パッケージにデータベース上の REFERENCE_USAGE 権限を付与します。

GRANT REFERENCE_USAGE ON DATABASE other_db
  TO SHARE IN APPLICATION PACKAGE app_pkg;
Copy

外部データベースに対する REFERENCE_USAGE を付与した後、次の例に示すように、プロバイダーは共有オブジェクトを参照するビューをアプリケーションパッケージ内に作成する必要があります。

CREATE VIEW app_pkg.shared_schema.shared_view
  AS SELECT c1, c2, c3, c4
  FROM other_db.other_schema.other_table;
Copy

このコマンドは、アプリケーションパッケージの外部のデータベース、テーブル、スキーマを参照するビューをアプリケーションパッケージ内に作成します。

ビューの作成後、次の例に示すように、スキーマとビューに対する権限をアプリケーションに付与する必要があります。

GRANT USAGE ON SCHEMA app_pkg.shared_schema
  TO SHARE IN APPLICATION PACKAGE app_pkg;
GRANT SELECT ON VIEW app_pkg.shared_schema.shared_view
  TO SHARE IN APPLICATION PACKAGE app_pkg;
Copy

共有オブジェクトにアクセスすることをコンシューマーに許可する

セットアップスクリプトで作成されたデータベースオブジェクトは、インストール後にアプリから直接アクセスできます。これには、テーブル、関数、プロシージャ、新しいビュー定義が含まれます。

デフォルトでは、アプリケーションパッケージと共有されているデータベースオブジェクトは、コンシューマーには表示されません。コンシューマーがデータコンテンツを表示しアクセスできるようにするには、アプリケーションパッケージにセキュアビューを作成し、適切な権限を付与する必要があります。

このアプローチには次のようなメリットがあります。

  • セットアップスクリプトでビューを作成すると、新しい列などの共有オブジェクトに直接加えられた変更は、セットアップスクリプトによってインストールされる Snowflake Native App のバージョンには表示されません。オブジェクトへの変更へのアクセスを許可するには、プロバイダーはアプリの新しいバージョンまたはパッチを作成する必要があります。

  • バージョン管理されたスキーマでビューを作成すると、 Snowflake Native App の各バージョンにそのバージョンのビューの定義だけが含まれるようになります。これはアップグレードのシナリオにおいて重要です。

共有オブジェクトをコンシューマーに公開するには、セットアップスクリプトに以下のコマンドを含める必要があります。

  • アプリケーションパッケージのバージョン管理されたスキーマ内にビューをインストールする。

  • アプリケーションロールを使用して、これらのビューへのアクセス権をコンシューマー付与する。

次の例では、アプリケーションロールを使用して、アプリケーションパッケージのセットアップスクリプト内で共有オブジェクトへのアクセス権を付与する方法を説明します。

CREATE APPLICATION ROLE app_user;

CREATE OR ALTER VERSIONED SCHEMA inst_schema;
GRANT USAGE ON SCHEMA inst_schema
  TO APPLICATION ROLE app_user;

CREATE VIEW IF NOT EXISTS inst_schema.shared_view
  AS SELECT c1, c2, c3, c4
  FROM shared_schema.shared_table;

GRANT SELECT ON VIEW inst_schema.shared_view
  TO APPLICATION ROLE app_user;
Copy

この例では、ビューは shared_schema.shared_view のコンテンツにアクセスし、アプリケーションパッケージと共有します。

注釈

プロバイダーがアプリケーションパッケージの外部のデータベースオブジェクトといった共有データコンテンツに直接アクセスするビューの定義を試みると、Snowflakeはエラーを返します。

プロキシビューのポリシーを定義する

Snowflakeは、セットアップスクリプト内でプロキシビューを作成し、それらを保護するポリシーを定義することを推奨します。プロキシビューを保護するポリシーを定義して、 Snowflake Native App をインストールした後にポリシーの定義を変更できないようにします。また、プロキシビューにポリシーを定義すると、アップグレード中に実行中のコードが、バージョン作成時に適用されたポリシーを引き続き使用できるようになります。

外部テーブルと Apache Iceberg™ テーブルのサポート

Snowflake Native App Framework により、プロバイダーは 外部テーブル および Apache Iceberg™ テーブル をコンシューマーと共有することができます。これらのタイプのテーブルを共有する方法は、プロバイダーがセットアップスクリプトにビューを追加し、これらのビューの権限をアプリケーションロールに付与するという点で、通常のテーブルに似ています。

注意

バッキング・オブジェクト・ストアがアプリ・リスティングと同じリージョンにない場合、外部テーブルおよび Apache Iceberg™ テーブルでは、プロバイダーまたはコンシューマーに追加のイグジットまたはイングレスのコストが発生する可能性があります。

外部テーブルまたはIcebergテーブルを共有する場合、以下の制限および要件が適用されます。

  • 外部およびIcebergテーブルと、それらにアクセスするビューは、アプリでは読み取り専用です。

  • Cross-Cloud Auto-Fulfillment は、外部テーブルまたは Iceberg テーブルを共有する アプリでは非対応です

  • コンシューマーは、アプリが外部テーブルまたはIcebergテーブルを使用できるようにする前に、プロバイダーアカウントでアプリが外部テーブルまたはIcebergテーブルを使用できるようにする必要があります。

Cross-Cloud Auto-Fulfillmentには非対応です

Cross-Cloud Auto-Fulfillment を有効にするリストを持つアプリでは、外部テーブルとIcebergテーブルは非対応です。

注釈

外部テーブルまたはIcebergテーブルを使用するアプリを複数のSnowflakeリージョンに公開するには、プロバイダーが各リージョンにリストを公開する必要があります。

プロバイダーが外部テーブルまたはIcebergテーブルを含むアプリのリストを作成した場合、SnowightではCross-Cloud Auto-Fulfillmentを設定する機能が無効になります。

プロバイダーが、Cross-Cloud Auto-Fulfillment が構成されているリストのデータ製品であるアプリケーションパッケージにバージョンまたはパッチを追加しようとすると、Snowflake はエラーを返します。

外部テーブルまたはIcebergテーブルをアプリに追加する

アプリケーションパッケージに外部テーブルまたはIcebergテーブルを追加することに加えて、プロバイダーは以下を実行する必要があります。

  • 外部テーブルとIcebergテーブルを有効にするためのエントリをマニフェストファイルに追加します。詳細については、 マニフェストに外部テーブルおよびIcebergテーブルのエントリを追加する をご参照ください。

  • プロバイダーは Python Permission SDK を使うことにより、コンシューマーが Snowsight を使用して、アプリが外部テーブルまたはIcebergテーブルにアクセスできるようにします。あるいは、プロバイダーはコンシューマーに外部テーブルまたはIcebergテーブルを手動で有効にするよう求めることもできます。詳細は Request permissions to access external and Iceberg tables をご参照ください。

共有オブジェクトに対する権限を取り消したり、共有オブジェクトをドロップしたりする場合は注意する

アプリケーションパッケージ内の共有オブジェクトから権限を取り消す場合や、共有オブジェクトを削除する場合は注意してください。 Snowflake Native App のインストールされたバージョンが引き続きそれらのオブジェクトにアクセスする必要がある場合、 Snowflake Native App は不安定になったり失敗したりする可能性があります。

共有オブジェクトに対する権限を取り消したりドロップしたりする

アプリケーションパッケージから共有オブジェクトに対する権限を取り消したり、共有オブジェクトをドロップしたりする場合には注意が必要です。インストールされたバージョンの Snowflake Native App がまだそれらのオブジェクトにアクセスする必要がある場合は、 Snowflake Native App が不安定になったり失敗したりする可能性があります。