SQL UDFs の紹介

ユーザー定義関数(UDF)のハンドラーを SQL で記述できます。このセクションのトピックでは、 SQL ハンドラーを設計および記述する方法について説明します。例もあります。

UDF ハンドラーを記述できる言語のリストを含む UDFs の概要については、 ユーザー定義関数の概要 をご参照ください。

ハンドラーを作成した後、 SQL で UDF を作成します。SQL を使用して UDF を作成または呼び出す方法については、 UDF の作成 または UDF の呼び出し をご参照ください。

注釈

SQL UDF ハンドラーに関連した制限については、 SQL UDF の制限事項 をご参照ください。

このトピックの内容:

SQL ハンドラーの仕組み

ユーザーが UDF を呼び出すと、ユーザーは UDFの名前と引数をSnowflakeに渡します。Snowflakeは、関連付けられたハンドラーコード(存在する場合は引数付き)を呼び出して、 UDF のロジックを実行します。次に、ハンドラーメソッドは出力をSnowflakeに返し、Snowflakeはそれをクライアントに返します。

関数定義は、スカラー(つまり、単一)値、またはテーブル関数として定義されている場合は行のセットを返す SQL 式です。

次の例のコードは、 UDF が引数として受け取った半径値から円の面積を計算するハンドラーコードを含む area_of_circle という名前の UDF を作成します。

CREATE FUNCTION area_of_circle(radius FLOAT)
  RETURNS FLOAT
  AS
  $$
    pi() * radius * radius
  $$
  ;
Copy

一般的な使用法

SQL UDF は、任意の SQL 式を評価し、式の結果を返します。

関数定義は、スカラー(つまり、単一)値、またはテーブル関数として定義されている場合は行のセットを返す SQL 式です。

SQL UDFs のセキュリティ/権限要件

関数定義が非修飾テーブルを参照する場合、そのテーブルは関数を含むスキーマで解決されます。別のスキーマオブジェクト(例: テーブル、ビュー、または他の関数)への参照には、その関数の所有者がそのスキーマオブジェクトにアクセスする権限を持っている必要があります。関数の呼び出し元は、関数定義で参照されるオブジェクトにアクセスする必要はありませんが、関数を使用するための権限のみが必要です。

例えば、管理者は通常アクセスできない機密データを含む users という名前のテーブルを所有していますが、管理者は他のユーザーがアクセス権限を持っている関数を通じて合計ユーザー数を公開できます。

use role dataadmin;

desc table users;

+-----------+--------------+--------+-------+---------+-------------+------------+--------+------------+---------+
| name      | type         | kind   | null? | default | primary key | unique key | check  | expression | comment |
|-----------+--------------+--------+-------+---------+-------------+------------+--------+------------+---------|
| USER_ID   | NUMBER(38,0) | COLUMN | Y     | [NULL]  | N           | N          | [NULL] | [NULL]     | [NULL]  |
| USER_NAME | VARCHAR(100) | COLUMN | Y     | [NULL]  | N           | N          | [NULL] | [NULL]     | [NULL]  |
  ...
  ...
  ...
+-----------+--------------+--------+-------+---------+-------------+------------+--------+------------+---------+

create function total_user_count() returns number as 'select count(*) from users';

grant usage on function total_user_count() to role analyst;

use role analyst;

-- This will fail because the role named "analyst" does not have the
-- privileges required in order to access the table named "users".
select * from users;

FAILURE: SQL compilation error:
Object 'USERS' does not exist.

-- However, this will succeed.
select total_user_count();

+--------------------+
| TOTAL_USER_COUNT() |
|--------------------+
| 123                |
+--------------------+
Copy

ロールと権限を使用してアクセス制御を管理する方法の詳細については、 アクセス制御の概要 をご参照ください。