セットアップスクリプトの作成¶
このトピックでは、セットアップスクリプトを使用して、アプリケーションのインストール時に作成されるオブジェクトを指定する方法について説明します。また、アプリケーションロールと、セットアップスクリプト内でのロールの使用方法についても説明します。
セットアップスクリプトについて¶
アプリケーションのセットアップスクリプトは、コンシューマーがアプリケーションをインストールまたはアップグレードするとき、あるいはプロバイダーがテスト用にアプリケーションをインストールまたはアップグレードするときに実行される、 SQL ステートメントを含んでいます。すべてのアプリケーションには、セットアップスクリプトが含まれている必要があります。セットアップスクリプトの場所は、マニフェストファイルで指定します。
セットアップスクリプトは、アプリケーションのインストール時またはアップグレード時に作成されるオブジェクトを定義します。
注釈
セットアップスクリプトは、アプリケーションパッケージを作成するために必要です。セットアップスクリプトの名前とパスは、 manifest.yml
ファイルで指定します。
セットアップスクリプトの制限¶
次の操作は、セットアップスクリプト内では実行できません。
ALTER <オブジェクト> コマンドを使用した LOG_LEVEL または TRACE_LEVEL プロパティの設定。
EXECUTE AS CALLER であるプロシージャの作成または呼び出し。
Snowparkユーザー定義関数(UDFs)、または名前付きステージから IMPORT を利用するプロシージャの作成。
拡張コードを使用するプロシージャ、関数、匿名コードブロックの呼び出し。
CREATE FUNCTION コマンドの使用時における、名前付きステージからのコードファイルのインポート。
EXECUTE AS CALLER を持つプロシージャを呼び出すには、 CALL を使用します。
バージョン管理されたスキーマ内で作成されるオブジェクトには、さらに制限があります。
セットアップスクリプトで作成されたオブジェクトのコンシューマーへの可視性¶
セットアップスクリプトは、ほとんどのデータベースレベルのオブジェクトを定義できます。セットアップスクリプトによって作成されたデータベースオブジェクトは、アプリケーションの内部オブジェクトです。これらは表示されず、コンシューマーアカウントは直接アクセスできません。
アプリケーションロールを使用して、これらのオブジェクトをコンシューマーに表示することができます。セットアップスクリプト内で作成されたアプリケーションロールは、インストールされたアプリケーションのインスタンスを所有するロールに自動的に付与されます。これらのロールを取り消すことはできません。
アプリケーションインスタンスを所有するロールを持つユーザーは、組織内の他のロールにアプリケーションロールを付与できます。たとえば、セットアップスクリプトは、 APP_ADMIN などのアプリケーションロールを定義して、アプリケーション内のオブジェクトへのアクセス権限を付与できます。そのユーザーは、アプリケーションを管理するためにこれらのオブジェクトを使用することができます。
セットアップスクリプトは、アプリケーションロールを定義することもできます(例: USER)。このロールを使用すると、コンシューマーにはアプリケーションで提供される機能を使用するためのアクセス権が付与されます。セットアップスクリプトは、 READ_ONLY などのアプリケーションロールを定義して、アプリケーション内にある一部のデータ領域へのアクセスを制限することができます。
セットアップスクリプトは、初期インストールとアップグレードの両方に使用されます。スクリプトは、べき等で記述する必要があります。たとえば、 CREATE でオブジェクトを作成します。IFNOT EXISTS または CREATE OR REPLACE。
セットアップスクリプトを作成する際のベストプラクティス¶
Snowflakeは、アプリケーションのセットアップスクリプトを作成する際に、以下のベストプラクティスをお勧めします。
セットアップスクリプト内で CREATE コマンドを使用してオブジェクトを作成する場合は、 CREATE OR REPLACE または CREATE IF NOT EXISTS バージョンのコマンドを使用することをSnowflakeはお勧めします。セットアップスクリプトは、インストール中やアップグレード中、またエラーが発生した場合に複数回実行することができます。たとえば、このような状況では、バージョン管理されたスキーマは空ではない可能性があります。
CREATE SCHEMA はセッションコンテキストを変更しないため、オブジェクトの作成時にターゲットスキーマでオブジェクトを修飾する必要があります。たとえば、セットアップスクリプト内でスキーマを作成するには、次のコマンドを使用します。
CREATE SCHEMA IF NOT EXISTS app_config; CREATE TABLE IF NOT EXISTS app_config.params(...);
バージョン管理されたスキーマオブジェクトとバージョン管理されていないオブジェクトは互いに参照することができます。セットアップスクリプトの実行中に障害が発生する可能性を考慮する必要があります。セットアップスクリプトはべき等で記述されているため、最初の実行に失敗すると自動的に再実行されます。
スキーマ内のアプリケーションロールに権限を付与する場合は、この点を考慮してください。たとえば、以下を考慮します。
CREATE OR REPLACE PROCEDURE app_state.proc()...; -- Additional CREATE statements GRANT USAGE ON PROCEDURE app_state.proc() TO APPLICATION ROLE app_user;
CREATE OR REPLACE ステートメントは、プロシージャを置き換え、そのプロシージャに対する以前の付与を暗黙的に削除します。付与はスクリプトの後半で復元されますが、スクリプトの実行時に失敗すると、コンシューマーはプロシージャにアクセスできなくなる可能性があります。
再試行で解決できない問題(構文エラーなど)が原因でセットアップスクリプトが失敗した場合は、新しいバージョンまたはパッチがアップグレードされて付与が復元されるまで、コンシューマーはプロシージャにアクセスできません。
共有コンテンツのビューは、常にバージョン管理されたスキーマで定義される必要があります。これにより、新しい列やその他の属性が追加されたり削除されたりしても、アップグレード中にビューにアクセスするコードは、一貫したビューを使用できるようになります。
大きな状態テーブルのアップグレードなど、非常に長時間の実行操作がセットアップスクリプトに必要な場合は、これらの更新が旧バージョンの既存の実行コードと互換性があることを確認してください。
アプリケーションロールについて¶
デフォルトでは、コンシューマーはアプリケーション内で作成されたオブジェクトに対する権限を持ちません。ACCOUNTADMIN ロールがあっても、アプリケーション 内 のオブジェクトを表示することはできません。アプリケーション自体の外部に作成するオブジェクト(例: データベース)は、コンシューマーカウントの ACCOUNTADMIN ロールにのみ表示されます。
アプリケーションロールはデータベースロールに似ていますが、アプリケーション内でのみ作成することができます。データベースロールとは異なり、アプリケーションロールはアプリケーションの外部に存在するオブジェクトに対して権限を付与することができます。
アプリケーションロールは、アプリケーションのインストール時にセットアップスクリプトによって作成される必要があり、アプリケーションの所有者ロールに自動的に付与されます。そのロールで、コンシューマーアカウント内にある他のロールにアプリケーションロールを付与することができます。
注釈
アプリケーションロールは、アプリケーション内で作成できる唯一のロールの型です。たとえば、データベースロールはアプリケーション内では許可されていません。
同様に、アプリケーションロールはアプリケーションでのみ作成でき、通常のデータベースやアカウントレベルでは作成できません。
アプリケーションロールに付与された権限はすべて、アプリケーションのインストールに使用されるロールであるアプリケーションの所有者に渡されます。所有者はさらに、コンシューマーカウント内の他のロールにアプリケーションロールを委任することができます。
データベースロールとは異なり、アプリケーションロールはインストールされたアプリケーション以外のオブジェクトに対しても権限を付与することができます。したがって、アプリケーションの外部にあるオブジェクトに対する権限を付与するために使用できます。ただし、アプリケーションロール自体はアプリケーション内で作成する必要があります。
アプリケーションロールを操作するためにサポートされている SQL コマンド¶
Snowflake Native App Framework は、アプリケーションロールを操作するために以下の SQL コマンドを提供しています。
セットアップスクリプトでのアプリケーションロールの使用¶
セットアップスクリプトで定義されたアプリケーションロールは、アプリケーションインスタンスを所有するロールに自動的に付与されます。アプリケーションがインストールされると、アプリケーションのインストールに使用されるロールがアプリケーションの所有者になります。ただし、アプリケーションの所有者は、コンシューマーカウントの他のアカウントロールに権限を付与することができます。
アプリケーションロールは、アプリケーション内のオブジェクトに対する権限をコンシューマーに付与することができるようにします。例:
CREATE APPLICATION ROLE admin;
CREATE APPLICATION ROLE user;
GRANT APPLICATION ROLE user TO APPLICATION ROLE admin;
CREATE OR ALTER VERSIONED SCHEMA app_code;
GRANT USAGE ON SCHEMA app_code TO APPLICATION ROLE admin;
GRANT USAGE ON SCHEMA app_code TO APPLICATION ROLE user;
CREATE OR REPLACE PROCEDURE app_code.config_app(...)
GRANT USAGE ON PROCEDURE app_code.config_app(..)
TO APPLICATION ROLE admin;
CREATE OR REPLACE FUNCTION app_code.add(x INT, y INT)
GRANT USAGE ON FUNCTION app_code.add(INT, INT)
TO APPLICATION ROLE admin;
GRANT USAGE ON FUNCTION app_code.add(INT, INT)
TO APPLICATION ROLE user;
この例では、セットアップスクリプトにより、 admin
そして user
という名前のアプリケーションロールが作成されます。そうすると、セットアップスクリプトは、アプリケーションコードを含むスキーマへのアクセス権を両方のアプリケーションロールに付与します。また、スキーマ内の add
関数へのアクセス権も付与します。 admin
ロールには、 config_app
プロシージャへのアクセス権も付与されます。
アプリケーションのロールおよびバージョン¶
アプリケーションロールはバージョン管理されません。つまり、アプリケーションロールをドロップしたり、バージョン管理されたスキーマにないオブジェクトから権限を取り消したりすると、アプリケーションの現在のバージョンやアップグレード中のバージョンに影響を与える可能性があります。アプリケーションロールを安全にドロップできるのは、それらのロールを使用するアプリケーションのバージョンをすべてドロップした場合のみです。
注釈
アプリケーションロールにオブジェクトの所有権を付与することはできません。つまり、セットアップスクリプトで定義されたアプリケーションロールは、インストールされた Snowflake Native App 内のオブジェクトにコンシューマーがアクセスすることを許可する場合にのみ使用します。