UDFs: funções com código do manipulador que lê arquivos de um estágio executado no contexto do proprietário¶
Atenção
Essa mudança de comportamento está no pacote 2023_03.
Para saber o status atual do pacote, consulte Histórico do pacote.
UDFs cujo código do manipulador lê arquivos de um estágio serão executadas no contexto do proprietário. Um chamador deve passar o local do arquivo como um URL com escopo, se o código do manipulador estiver em uma UDF ou procedimento e independentemente de estarem sendo executados com direitos de chamador ou proprietário:
- Anteriormente:
Quando o código Java em um manipulador de UDF lê um arquivo de um estágio, ele faz isso usando o contexto do chamador.
Um chamador pode passar a localização do arquivo para a função usando um formulário como
select my_function('@stage-name/filename.txt').
O código do manipulador recebe o URL do estágio e lê o arquivo com
SnowflakeFile.newInstance
eSnowflakeFile.getInputStream
ou recebe o arquivo como umjava.io.InputStream
:SnowflakeFile sfFile = SnowflakeFile.newInstance(file_url); InputStream is = sfFile.getInputStream();
Os arquivos lidos pelo código do manipulador podem estar em um estágio externo ou em um usuário ou estágio interno nomeado.
- Atualmente:
Quando o código Java em um manipulador de UDF lê um arquivo de um estágio, ele fará isso usando o contexto do proprietário.
Para ambos UDFs e procedimentos, um chamador deve passar a localização do arquivo em um URL com escopo usando a função BUILD_SCOPED_FILE_URL, como no exemplo de função a seguir:
select my_func(build_scoped_file_url(@my_stage, 'filename.txt'));
O código do manipulador recebe o URL com escopo e lê o arquivo como antes.
SnowflakeFile sfFile = SnowflakeFile.newInstance(scopedFileUrl); InputStream is = sfFile.getInputStream();
Para arquivos cujos locais são especificados no código do manipulador (não como URLs com escopo passados por um chamador), você pode ler o arquivo preparado de duas maneiras: o código do manipulador pode chamar o método newInstance com um valor booleano para um novo parâmetro requireScopedUrl; ou o código do manipulador deve usar um URL com escopo ao criar um InputStream do caminho do arquivo.
O exemplo a seguir usa
SnowflakeFile.newInstance
:String filename = “@my_stage/filename.txt”; SnowflakeFile sfFile = SnowflakeFile.newInstance(filename, require_scoped_url = false).
Além disso, os estágios do usuário não são mais suportados como locais para arquivos lidos por um manipulador. Os arquivos lidos pelo código do manipulador devem estar em um estágio externo ou em um estágio interno nomeado.
Ref: 1008