UDFs: ステージからファイルを読み取るハンドラーコードを使用した関数が、所有者のコンテキストで実行される¶
ステージからファイルを読み取るハンドラーコードの UDFs は、所有者のコンテキストで実行されます。呼び出し元は、ハンドラーコードが UDF またはプロシージャ内にあるかどうか、また呼び出し元権限または所有者権限のどちらで実行されているかにかかわらず、ファイルの場所をスコープ付き URL として渡す必要があります。
- 以前:
UDF ハンドラーにあるJavaコードが ステージからのファイルを読み取る 場合は、呼び出し元のコンテキストを使用して読み取ります。
呼び出し元は、
select my_function('@stage-name/filename.txt').
のような形式でファイルの場所を関数に渡すことができます。ハンドラーコードは、ステージ URL を受け取り、
SnowflakeFile.newInstance
とSnowflakeFile.getInputStream
を使用してファイルを読み取るか、java.io.InputStream
としてファイルを受け取ります。SnowflakeFile sfFile = SnowflakeFile.newInstance(file_url); InputStream is = sfFile.getInputStream();
ハンドラーコードによって読み取られたファイルは、外部ステージにある場合もあれば、ユーザーまたは名前付きの内部ステージにある場合もあります。
- 現在:
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();
ハンドラーコード内で場所が指定されたファイル(呼び出し元から渡されたスコープ付き URLs ではなく)については、次に挙げる2つの方法のいずれかでステージングされたファイルを読み取ることができます。ハンドラーコードは、新しい requireScopedUrl パラメーターにブール値を指定してnewInstanceメソッドを呼び出すか、ハンドラーコードはファイルパスから InputStream を作成する際にスコープ付き URL を使用する必要があります。
次の例では、
SnowflakeFile.newInstance
を使用します。String filename = “@my_stage/filename.txt”; SnowflakeFile sfFile = SnowflakeFile.newInstance(filename, require_scoped_url = false).
また、ユーザーステージは、ハンドラーが読み取るファイルの場所としてサポートされなくなりました。ハンドラーコードが読み取るファイルは、外部ステージまたは名前付き内部ステージにある必要があります。
参照: 1008