バージョンスキーマを使用して、バージョン間でアプリ・オブジェクトを管理

このトピックでは、 Snowflake Native App をインストールしたりアップグレードしたりする際に、バージョンスキーマを使ってアプリの状態を管理する方法について説明します。

バージョン・スキーマについて

バージョンスキーマは、あるバージョンから別のバージョンへのステートレスオブジェクトを扱うように設計された、特別なタイプのデータベーススキーマです。

バージョンスキーマには、特定のバージョンに関連付けられたアプリ内のオブジェクトに関するメタデータが含まれます。バージョンの固定とは、バージョンスキーマの機能で、どのジョブやクエリなどがこれらのオブジェクトに関連付けられているかをアプリが知ることができます。

例えば、バージョンスキーマのオブジェクトがクエリを実行すると、そのクエリはクエリを実行するアプリのバージョンに「固定」されます。

バージョンの固定は、アプリを新しいバージョンにアップグレードする際に重要です。あるアプリのV1が、完了までに長い時間を要する複雑なクエリを実行する場合を考えてみましょう。

このクエリの実行中にアップグレードが発生すると、アプリのアップグレード状態は COMPLETE に変わり、アプリは v2 にアップグレードされます。バージョン v1 からのすべてのジョブが完了するまで、以前のバージョンの状態は FINALIZING に変わります。

アプリのアップグレード状態の詳細情報については、 アップグレード状態 をご参照ください。

バージョンスキーマの制限

  • Snowparkコンテナーサービスはバージョンスキーマにはサポートされていません。

  • バージョンスキーマは、アプリケーション・オブジェクトのコンテキスト内でのみ利用可能です。これらはセットアップスクリプト内でのみ作成されます。アプリの各バージョンには独自のセットアップスクリプトがあり、そのバージョン固有のスキーマが含まれています。

  • バージョンスキーマは、アプリケーション・パッケージのセットアップ・スクリプト内でのみ使用できます。アプリケーションオブジェクトのコンテキスト内でのみ作成できます。

  • タスクはバージョン管理されたスキーマではサポートされていません。例えば、プロバイダーはバージョンスキーマを作成または変更する際にタグを含めることはできません。ただし、プロバイダーは、同じアプリ内のバージョン管理されたスキーマ内のタグオブジェクトのみを適用する限り、バージョン管理されたスキーマ内でタグを使用することができます。

  • タグとマスキング・ポリシーはバージョンスキーマではサポートされていません。

  • バージョンスキーマでは、付与と将来の付与はサポートされていません。

  • バージョンスキーマは、クローン操作のソースとしても宛先としても使用できません。

  • バージョンスキーマの削除はサポートされていません。バージョンスキーマを削除すると、そのスキーマに含まれるオブジェクトのすべてのバージョンが削除され、古いバージョンやパッチのアプリに対して実行されるクエリに影響を与えます。

注釈

アプリケーションのセットアップスクリプト内でアプリケーションロール、タスク、タグ、マスキングポリシー、Snowparkコンテナーサービスを使用するには、通常のスキーマで作成する必要があります。

バージョン管理スキーマの内部実装

内部的には、バージョンスキーマはアプリの各バージョンに対応するサブスキーマを含んでいます。

しかし、これらのサブスキーマはアプリケーションオブジェクト内のコンシューマーには直接アクセスできません。コンシューマーは、自分のアカウントにインストールされているアプリのバージョンに対応するバージョンスキーマ内のオブジェクトのみを見ることができます。

例えば、コンシューマーが SHOW OBJECTS コマンドを使用してバージョン管理されたスキーマのオブジェクトを表示する場合、現在使用しているバージョンのオブジェクトしか表示されません。

セットアップ・スクリプトを記述する際、プロバイダーは CREATE OR REPLACE または CREATE IF NOT EXISTS を使用してバージョン・スキーマのオブジェクトを再作成する必要があります。内部的には、アプリの各バージョンはバージョン管理スキーマのサブスキーマ内に独自のオブジェクトを持っているため、これは重要です。

セットアップ・スクリプトでのバージョンスキーマと非バージョンスキーマの使用

アップグレード中のアプリの状態を管理するために、 Snowflake Native App Framework はバージョン管理されたスキーマを使用します。バージョンスキーマは、通常のデータベーススキーマと似ていますが、異なるアプリケーションバージョンによって作成された複数のバージョンのオブジェクトを扱うための関数が追加されています。

バージョンスキーマは、アプリケーション・オブジェクトのコンテキスト内でのみ利用可能です。これらはセットアップスクリプト内でのみ作成されます。アプリの各バージョンには独自のセットアップスクリプトがあり、そのバージョン固有のスキーマが含まれています。

アプリの新バージョンを開発する場合、プロバイダーは、セットアップスクリプトを使用してアプリが作成するオブジェクトの変更をアカウントする必要があります。

次の例では、バージョン付きスキーマと通常のスキーマの両方をセットアップ・スクリプトで使用して、ステートレス・コンポーネントとステートフル・コンポーネントを作成する一般的な状況を示します。

CREATE OR ALTER VERSIONED SCHEMA stateless_objects;
CREATE OR REPLACE PROCEDURE stateless_object.py_echo_proc(STR string)
  RETURNS STRING
  LANGUAGE PYTHON
  RUNTIME_VERSION=3.8
  PACKAGES=('snowflake-snowpark-python')
  HANDLER='echo.echo_proc'
  IMPORTS=('/libraries/echo.py');

CREATE OR ALTER SCHEMA stateful_object;
CREATE TABLE stateful_object.config_props
  prop_name STRING;
  prop_value STRING;
  time_stamp TIMESTAMP;
Copy

バージョンスキーマの作成

セットアップ・スクリプトでバージョン管理スキーマを作成するには、次の例に示すように CREATE OR ALTER VERSIONED SCHEMA コマンドを使用します。

CREATE OR ALTER VERSIONED SCHEMA version_schema;
Copy

注釈

バージョン管理されたスキーマがバージョンやパッチ間で互換性があることを保証するために、常にこのコマンドの CREATE OR ALTER バージョンを含めるべきです。

ステートフルオブジェクトには非バージョンスキーマを使用します。

アプリ内のオブジェクトは、バージョン間で状態を保持する必要がある場合があります。例えば、構成データやアプリの実行中に収集されたデータを保存することができます。

これらのタイプのオブジェクトは通常のデータベーススキーマに存在する必要があり、初期インストール時やアップグレード時に持続するように作成する必要があります。

次の例は、セットアップ・スクリプトでステートフル・オブジェクトを作成する方法を示しています。

CREATE SCHEMA IF NOT EXISTS stateful_object;

CREATE TABLE IF NOT EXISTS stateful_object.config (
  config_param STRING,
  config_value STRING,
  default_value STRING,
  modified_on  TIMESTAMP);

ALTER TABLE stateful_object.config
  ADD COLUMN IF NOT EXISTS modified_on TIMESTAMP;
Copy

この例では、セットアップスクリプトは、アプリのあるバージョンから別のバージョンまで持続する構成テーブルを定義します。以前のバージョンのアプリケーションに modified_on 列がなかった場合、セットアップスクリプトはまず、テーブルの完全な作成(初期インストールの場合)、または列の追加による既存のテーブルの変更(アップグレードの場合)を試みます。

ステートレスオブジェクトにバージョンスキーマを使用

アプリケーション内のいくつかのオブジェクトは、アプリケーションのバージョン間で状態を永続化しません。たとえば、ストアドプロシージャ、関数などのアプリケーション ロジックを定義するコードは、ユーザー データや状態を失うことなく、セットアップ スクリプトで完全に再作成できます。

Snowflake では、これらのオブジェクトをバージョン管理されたスキーマに含めることを推奨しています。

次の例は、バージョン・スキーマ内に UDF を作成する方法を示しています。

CREATE OR ALTER VERSIONED SCHEMA stateless_object;
CREATE FUNCTION IF NOT EXISTS stateless_object.add(x int, y int)
  RETURNS INT
  LANGUAGE SQL
  AS $$ x + y $$;
Copy

バージョンの固定

バージョンスキーマには、 Snowflake Native App に、どのオブジェクトが特定のバージョンに関連付けられているかというメタデータが含まれています。バージョンの固定とは、バージョンスキーマの機能で、どのジョブやクエリなどがこれらのオブジェクトに関連付けられているかをアプリが知ることができます。

例えば、バージョンスキーマのオブジェクトがクエリを実行すると、そのクエリはクエリを実行するアプリのバージョンに「固定」されます。

バージョンの固定は、アプリを新しいバージョンにアップグレードする際に重要です。あるアプリのV1が、完了までに長い時間を要する複雑なクエリを実行する場合を考えてみましょう。このクエリの実行中にアップグレードが発生した場合、クエリが完了するまでアプリはアップグレードされません。