アプリケーションパッケージへの共有データコンテンツの追加

このトピックでは、アプリケーションパッケージに共有データコンテンツを追加する方法について説明します。

アプリケーションパッケージでのデータコンテンツの共有について

Snowflake Native App Framework により、アプリケーションパッケージに共有データコンテンツを追加できます。このデータコンテンツは、 Snowflake Native App を使用するコンシューマーと共有されます。アプリケーションパッケージで共有するデータコンテンツは、 Snowflake Native App のインストールされているすべてのインスタンスで共有されます。

共有データコンテンツはバージョン管理されません。つまり、 Snowflake Native App のすべてのバージョンが同じデータを使用します。これが、バージョン管理されているアプリケーションロジックとは異なる点です。

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

アプリケーションパッケージと共有できるデータベースオブジェクト

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

  • スキーマ

  • テーブル

  • ビュー

注釈

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

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

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

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

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

  • 外部テーブルはサポートされていません。

アプリケーションパッケージ内でのデータコンテンツの共有

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

アプリケーションパッケージからインストールされた Snowflake Native App にオブジェクトを表示するには、次の例に示すように 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 から Snowflake Native App をインストールした後、 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 VIEW IF NOT EXISTS inst_schema.shared_view
  AS SELECT c1, c2, c3, c4
  FROM shared_schema.shared_view;
Copy

このビューは、前のセクションの例と同様に、アプリケーションパッケージと共有されている shared_schema.shared_view 内のコンテンツにアクセスします。

注釈

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

共有オブジェクトのコンシューマーへの公開

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

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

  • セットアップスクリプトでビューを作成すると、新しい列などの共有オブジェクトに直接加えられた変更は、セットアップスクリプトによってインストールされる 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

Snowflake Native App Framework が共有コンテンツを保護する仕組み

プロバイダーのデータコンテンツのプライバシーと整合性を保護するため、 Snowflake Native App Framework は以下の制限を実装します。

  • インストールされた Snowflake Native App では、共有オブジェクトは読み取り専用です。

  • 共有オブジェクトはコンシューマーに直接公開されません。オブジェクトは、 Snowflake Native App のインストール時にセットアップスクリプトの実行によりインストールされるセキュアビューを介してのみ公開されます。

  • 共有コンテンツを更新できるのはプロバイダーのみです。

  • 特定の権限を持つインストール済み Snowflake Native App のインスタンスと共有できるのは、以下のオブジェクトのみです。

    • スキーマ: Snowflake Native App の共有コンテンツに付与できる権限は USAGE のみです。

    • テーブル: Snowflake Native App の共有コンテンツに付与できる権限は SELECT のみです。定義されたポリシー(行アクセス、マスキング、タグベースなど)を持つテーブルは共有できません。ポリシーは、オブジェクトがコンシューマーに公開されるときに、オブジェクトに対して定義することができます。

    • ビュー: アプリケーションパッケージの共有コンテンツに付与できる権限は SELECT のみです。行アクセス、マスキング、タグベースなど、定義されたポリシーを持つビューは共有できません。

注釈

ビューや、ビューから構成されるビューには、 JavaScript、Java、Python、Scalaの関数を含めることはできません。

詳細については、 共有オブジェクトのコンシューマーへの公開 をご参照ください

ポリシーとのデータコンテンツの共有制限

プロバイダーは、マスキング、行アクセス、その他のポリシータイプを含むポリシーでテーブルとビューを共有することはできません。プロバイダー側でポリシーを追加または変更すると、実行中の Snowflake Native App のインスタンスが即座に破損するため、この制限が必要です。

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

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

共有オブジェクトに対する権限の取り消しおよび削除

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