UDFs:具有处理程序代码的函数从暂存区读取文件,在所有者的上下文中执行¶
如果处理程序代码从暂存区读取文件,则该 UDFs 将在所有者的上下文中执行。调用方必须将文件位置作为有作用域的 URL 进行传递,无论处理程序代码是在 UDF 中还是在过程中,也无论其使用调用方权限还是所有者权限运行:
- 之前:
当 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),可以通过以下两种方式之一读取暂存文件:处理程序代码可以调用 newInstance 方法,并为新的 requireScopedUrl 参数设置一个布尔值;或者处理程序代码从文件路径创建 InputStream 时必须使用有作用域的 URL。
以下示例使用了
SnowflakeFile.newInstance
:String filename = "@my_stage/filename.txt"; SnowflakeFile sfFile = SnowflakeFile.newInstance(filename, require_scoped_url = false);
此外,不再支持将用户暂存区作为由处理程序读取的文件的位置。处理程序代码读取的文件必须位于外部暂存区或命名的内部暂存区。
参考:1008