UDFs: ステージからファイルを読み取るハンドラーコードを使用した関数が、所有者のコンテキストで実行される

注意

この動作変更は2023_03バンドルにあります。

バンドルの現在のステータスについては、 バンドル履歴 をご参照ください。

ステージからファイルを読み取るハンドラーコードの UDFs は、所有者のコンテキストで実行されます。呼び出し元は、ハンドラーコードが UDF またはプロシージャ内にあるかどうか、また呼び出し元権限または所有者権限のどちらで実行されているかにかかわらず、ファイルの場所をスコープ付き URL として渡す必要があります。

以前

UDF ハンドラーにあるJavaコードが ステージからのファイルを読み取る 場合は、呼び出し元のコンテキストを使用して読み取ります。

呼び出し元は、 select my_function('@stage-name/filename.txt'). のような形式でファイルの場所を関数に渡すことができます。

ハンドラーコードは、ステージ URL を受け取り、 SnowflakeFile.newInstanceSnowflakeFile.getInputStream を使用してファイルを読み取るか、 java.io.InputStream としてファイルを受け取ります。

SnowflakeFile sfFile = SnowflakeFile.newInstance(file_url);
InputStream is = sfFile.getInputStream();
Copy

ハンドラーコードによって読み取られたファイルは、外部ステージにある場合もあれば、ユーザーまたは名前付きの内部ステージにある場合もあります。

現在

UDF ハンドラーにあるJavaコードがステージからファイルを読み取る場合は、所有者のコンテキストを使用して読み取ります。

UDFs とプロシージャの両方で、呼び出し元は、次に挙げる関数の例のように、 BUILD_SCOPED_FILE_URL 関数を使用して、スコープ付き URL でファイルの場所を渡す必要があります。

select my_func(build_scoped_file_url(@my_stage, 'filename.txt'));

ハンドラーコードはスコープ付き URL を受け取り、従来通りファイルを読み取ります。

SnowflakeFile sfFile = SnowflakeFile.newInstance(scopedFileUrl);
InputStream is = sfFile.getInputStream();
Copy

ハンドラーコード内で場所が指定されたファイル(呼び出し元から渡されたスコープ付き URLs ではなく)については、次に挙げる2つの方法のいずれかでステージングされたファイルを読み取ることができます。ハンドラーコードは、新しい requireScopedUrl パラメーターにブール値を指定してnewInstanceメソッドを呼び出すか、ハンドラーコードはファイルパスから InputStream を作成する際にスコープ付き URL を使用する必要があります。

次の例では、 SnowflakeFile.newInstance を使用します。

String filename = “@my_stage/filename.txt”;
SnowflakeFile sfFile = SnowflakeFile.newInstance(filename, require_scoped_url = false).
Copy

また、ユーザーステージは、ハンドラーが読み取るファイルの場所としてサポートされなくなりました。ハンドラーコードが読み取るファイルは、外部ステージまたは名前付き内部ステージにある必要があります。

参照: 1008