ストアドプロシージャの概要¶
ストアドプロシージャを書いて、プロシージャ コードでシステムを拡張することができます。プロシージャを使えば、分岐やループ、その他のプログラム構文を使うことができます。プロシージャは、他のコードから呼び出すことで複数回再利用することができます。
ストアドプロシージャを使うと、以下のことができます。
複数のデータベース操作を頻繁に実行する必要があるタスクを自動化します。
データベース操作を動的に作成し、実行します。
プロシージャを実行するロールの権限ではなく、プロシージャを所有するロールの権限でコードを実行する。
これによりストアドプロシージャの所有者は、別の方法では指定された操作を実行できなかったユーザーに、実行する権限を委任できます。ただし、これらの所有者の権利のストアドプロシージャには制限があります。
たとえば、指定した日付より古いデータを削除して、データベースを「クリーンアップ」するとします。コード内で削除演算子を複数回実行し、その都度特定のテーブルからデータを削除することができます。これらのステートメントを1つのストアドプロシージャにまとめ、締切日を指定するパラメーターを渡すことができます。
プロシージャが配置されたら、それを呼び出してデータベースをクリーンアップします。データベースが変更されたら、プロシージャを更新して追加のテーブルをクリーンアップできます。新しいクリーンアップコマンドを使用するユーザーが複数いる場合、すべてのテーブル名を記憶して各テーブルを個別にクリーンアップするのではなく、1つのプロシージャを呼び出すことができます。
ストアドプロシージャは UDF に似ていますが、この2つは重要な点で異なります。詳細については、 ストアドプロシージャとユーザー定義関数のどちらを記述するかの選択 をご参照ください。
プロシージャはSnowflakeを拡張する1つの方法に過ぎません。その他については、次をご参照ください。
対応言語とツール¶
ストアドプロシージャ(およびその他のSnowflakeエンティティ)は、作業方法に応じて複数のツールのいずれかを使用して作成および管理できます。
言語 |
アプローチ |
サポート |
---|---|---|
SQL Java、 JavaScript、Python、Scala、 SQL Scripting のハンドラーを使用。 |
Snowflakeで、Snowflakeエンティティを作成・管理する SQL コードを記述します。プロシージャのロジックを、サポートされているハンドラー言語のいずれかで記述します。 |
|
Java、Python、またはScala |
クライアント上で、処理のためにSnowflakeにプッシュされる演算子のコードを記述します。 |
|
コマンドラインインターフェイス |
コマンドラインを使用して、 JSON オブジェクトのプロパティとしてプロパティを指定し、Snowflake エンティティを作成および管理します。 |
|
Python |
クライアント上で、Snowflakeの管理操作を実行するコードを記述します。 |
|
REST |
RESTful エンドポイントにリクエストを行い、Snowflake エンティティを作成および管理します。 |
プロシージャのロジック(そのハンドラー)を、 サポートされている言語 のいずれかで記述します。ハンドラーを作成したら、 CREATE PROCEDURE コマンドで プロシージャを作成 し、 CALL ステートメントで プロシージャを呼び出します。
ストアドプロシージャから、単一の値または(ハンドラー言語でサポートされている)表形式のデータを返すことができます。サポートされている戻り値の型の詳細については、 CREATE PROCEDURE をご覧ください。
言語を選択するときは、サポートされているハンドラーの場所も考慮してください。すべての言語がステージ上のハンドラーの参照をサポートしているわけではありません(ハンドラーコードはインラインにする必要があります)。詳細については、 ハンドラーコードのインラインまたはステージ上での保持 をご参照ください。
言語 |
ハンドラーの場所 |
---|---|
Java |
インラインまたはステージング |
JavaScript |
インライン |
Python |
インラインまたはステージング |
Scala |
インラインまたはステージング |
Snowflakeスクリプト |
インライン |
注釈
匿名プロシージャの作成と呼び出しの両方を実行するには、 CALL (匿名プロシージャでの場合) を使用します。匿名プロシージャの作成と呼び出しには、 CREATE PROCEDURE スキーマ権限を持つロールは必要ありません。
ストアドプロシージャの例¶
次の例にあるコードは、 run
というPythonハンドラーを使用して myproc
というストアドプロシージャを作成します。
CREATE OR REPLACE PROCEDURE myproc(from_table STRING, to_table STRING, count INT)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = '3.9'
PACKAGES = ('snowflake-snowpark-python')
HANDLER = 'run'
as
$$
def run(session, from_table, to_table, count):
session.table(from_table).limit(count).write.save_as_table(to_table)
return "SUCCESS"
$$;
次の例にあるコードは、ストアドプロシージャ myproc
を呼び出します。
CALL myproc('table_a', 'table_b', 5);
ガイドラインと制約¶
- ヒント:
ストアドプロシージャの記述に関するヒントについては、 ストアドプロシージャの使用 をご参照ください。
- Snowflakeの制約:
Snowflakeの制約内で開発することにより、Snowflake環境内での安定性を確保できます。詳細については、 Snowflakeが課す制約内でのハンドラーの設計 をご参照ください。
- 命名:
他のプロシージャとの衝突を避ける方法でプロシージャに名前を付けるようにしてください。詳細については、 プロシージャおよび UDFs の命名とオーバーロード をご参照ください。
- 引数:
ストアドプロシージャの引数を指定し、どの引数がオプションであるかを示します。詳細については、 UDFs およびストアドプロシージャの引数の定義 をご参照ください。
- データ型マッピング:
ハンドラー言語ごとに、言語のデータ型と、引数および戻り値に使用される SQL 型との間に個別のマッピングのセットがあります。各言語のマッピングの詳細については、 SQL とハンドラー言語間のデータ型マッピング をご参照ください。
ハンドラーの記述¶
- ハンドラー言語:
ハンドラーの記述に関する言語固有のコンテンツについては、 対応言語とツール をご参照ください。
- 外部ネットワークアクセス:
外部ネットワークアクセス で外部ネットワークロケーションにアクセスできます。Snowflakeの外部にある特定のネットワークロケーションへのセキュアアクセスを作成して、ハンドラーコード内からそのアクセスを使用することができます。
- ログおよびトレース:
ログメッセージやトレースイベントをキャプチャ し、後でクエリできるデータベースにデータを保存すると、コードのアクティビティを記録できます。
セキュリティ¶
呼び出し元の権限または所有者の権限でストアドプロシージャを実行することを選択したかどうかは、ストアドプロシージャがアクセスできる情報と、実行できるタスクに影響を与える可能性があります。詳細については、 呼び出し元権限と所有者権限のストアドプロシージャについて をご参照ください。
ストアドプロシージャは、特定のセキュリティ上の問題をユーザー定義関数(UDFs)と共有しています。詳細については、次をご参照ください。
UDFs とプロシージャのセキュリティプラクティス で説明されているベストプラクティスに従うと、プロシージャのハンドラーコードを安全に実行することができます。
機密情報は、アクセスしてはならないユーザーから隠されていることを確認してください。詳細については、 セキュア UDFs とストアドプロシージャの使用による機密情報の保護 をご参照ください
ハンドラーコードのデプロイメント¶
プロシージャを作成するとき、プロシージャのロジックを実装するハンドラーを、 CREATE PROCEDURE ステートメントとインラインのコードとして、またはパッケージ化されてステージにコピーされたコンパイル済みコードなど、ステートメントの外部のコードとして指定できます。
詳細については、 ハンドラーコードのインラインまたはステージ上での保持 をご参照ください。