アプリケーションパッケージに共有データコンテンツを追加する

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

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

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 のインスタンスが即座に破損するため、この制限が必要です。

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

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

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

アプリケーションパッケージにデータコンテンツを含めるには、アプリケーションパッケージと共有するオブジェクトに対する権限を付与する必要があります。アプリケーションパッケージ内にオブジェクトを追加すると、デフォルトでは、そのオブジェクトがアプリケーションパッケージに対してプライベートになり、 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 コマンドを使用して、ビューをアプリケーションと共有することもできます。

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

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

アプリケーションパッケージの外部に存在するオブジェクトの参照

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

別のデータベースのオブジェクトを共有する前に、次の例に示すように、そのデータベースに対する 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 がまだそれらのオブジェクトにアクセスする必要がある場合は、 Snowflake Native App が不安定になったり失敗したりする可能性があります。

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

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