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 e SnowflakeFile.getInputStream ou recebe o arquivo como um java.io.InputStream:

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

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();
Copy

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).
Copy

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