CREATE EXTERNAL FUNCTION¶
Cria uma nova função externa.
- Consulte também:
ALTER FUNCTION , SHOW EXTERNAL FUNCTIONS , DROP FUNCTION , DESCRIBE FUNCTION , CREATE API INTEGRATION
Sintaxe¶
CREATE [ OR REPLACE ] [ SECURE ] EXTERNAL FUNCTION <name> ( [ <arg_name> <arg_data_type> ] [ , ... ] )
RETURNS <result_data_type>
[ [ NOT ] NULL ]
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ { VOLATILE | IMMUTABLE } ]
[ COMMENT = '<string_literal>' ]
API_INTEGRATION = <api_integration_name>
[ HEADERS = ( '<header_1>' = '<value_1>' [ , '<header_2>' = '<value_2>' ... ] ) ]
[ CONTEXT_HEADERS = ( <context_function_1> [ , <context_function_2> ...] ) ]
[ MAX_BATCH_ROWS = <integer> ]
[ COMPRESSION = <compression_type> ]
[ REQUEST_TRANSLATOR = <request_translator_udf_name> ]
[ RESPONSE_TRANSLATOR = <response_translator_udf_name> ]
AS <url_of_proxy_and_resource>;
Parâmetros obrigatórios¶
name
:Especifica o identificador da função.
O identificador pode conter o nome do esquema e o nome do banco de dados, assim como o nome da função.
O identificador não precisa ser único para o esquema no qual a função é criada, pois as funções são identificadas e resolvidas por seu nome e tipos de argumentos. Entretanto, a assinatura (nome e tipos de dados de argumento) deve ser única dentro do esquema.
O
name
deve seguir as regras para os identificadores Snowflake. Para obter mais detalhes, consulte Requisitos para identificadores.A configuração de
name
igual ao nome do serviço remoto pode tornar a relação mais clara. No entanto, isto não é necessário.( [ arg_name arg_data_type ] [ , ... ] )
Especifica os argumentos/entradas para a função externa. Eles devem corresponder aos argumentos que o serviço remoto espera.
Se não houver argumentos, incluir os parênteses sem nome(s) de argumento(s) e tipo(s) de dados.
RETURNS result_data_type
Especifica o tipo de dados retornados pela função.
API_INTEGRATION = api_integration_name
Este é o nome do objeto de integração de API que deve ser usado para autenticar a chamada para o serviço de proxy.
AS url_of_proxy_and_resource
Este é o URL de invocação do serviço de proxy (por exemplo, API Gateway ou API Management) e recurso através do qual o Snowflake chama o serviço remoto.
Parâmetros opcionais¶
SECURE
Especifica que a função é segura. Se uma função for segura, o URL, os cabeçalhos HTTP e os cabeçalhos de contexto são ocultados de todos os usuários que não são proprietários da função.
[ [ NOT ] NULL ]
Esta cláusula indica se a função pode retornar valores NULL ou deve retornar somente valores NON NULL. Se
NOT NULL
for especificado, a função deve retornar somente valores diferentes de NULL. SeNULL
for especificado, a função pode retornar valores NULL.Padrão: o padrão é NULL (ou seja, a função pode retornar os valores NULL).
CALLED ON NULL INPUT
ou .{ RETURNS NULL ON NULL INPUT | STRICT }
Especifica o comportamento da função quando chamada com entradas nulas. Ao contrário das funções definidas pelo sistema, que sempre retornam nulo quando qualquer entrada é nula, as funções externas podem lidar com entradas nulas, retornando valores não nulos mesmo quando uma entrada é nula:
CALLED ON NULL INPUT
sempre chamará a função com entradas nulas. Cabe à função lidar adequadamente com tais valores.RETURNS NULL ON NULL INPUT
(ou seu sinônimoSTRICT
) não chamará a função se alguma entrada for nula. Em vez disso, um valor nulo será sempre retornado para essa linha. Note que a função ainda pode retornar nulo para entradas não nulas.
Padrão:
CALLED ON NULL INPUT
{ VOLATILE | IMMUTABLE }
Especifica o comportamento da função ao retornar resultados:
VOLATILE
: a função pode retornar valores diferentes para linhas diferentes, mesmo para a mesma entrada (por exemplo, devido ao não determinismo e estado).IMMUTABLE
: a função sempre retorna o mesmo resultado quando chamada com a mesma entrada. O Snowflake não verifica ou garante isto; o serviço remoto deve ser projetado para comportar-se desta maneira. EspecificarIMMUTABLE
para uma função que realmente retorna valores diferentes para a mesma entrada resultará em comportamento indefinido.
Padrão:
VOLATILE
O Snowflake recomenda que você defina isto explicitamente em vez de aceitar o padrão. Esta configuração reduz explicitamente a chance de erro e diz aos usuários como a função se comporta. (O comando SHOW EXTERNAL FUNCTIONS mostra se uma função é volátil ou imutável).
Para informações adicionais importantes sobre funções externas VOLATILE vs. IMMUTABLE, consulte Categorizar sua função como volátil ou imutável.
COMMENT = 'string_literal'
Especifica um comentário para a função, que é exibido na coluna DESCRIPTION na saída SHOW FUNCTIONS e SHOW EXTERNAL FUNCTIONS na saída.
Padrão:
user-defined function
HEADERS = ( 'header_1' = 'value_1' [ , 'header_2' = 'value_2' ... ] )
Esta cláusula permite aos usuários especificar os metadados de valor chave que são enviados com cada solicitação. O criador da função externa decide o que vai para os cabeçalhos, e o chamador não tem nenhum controle sobre ele. O Snowflake preenche todos os nomes de cabeçalho especificados com o prefixo “sf-custom-”, e os envia como cabeçalhos HTTP.
O valor deve ser uma cadeia de caracteres constante, não uma expressão.
Aqui está um exemplo:
HEADERS = ( 'volume-measure' = 'liters', 'distance-measure' = 'kilometers' )
Isto faz com que o Snowflake acrescente 2 cabeçalhos HTTP a cada solicitação HTTPS:
sf-custom-volume-measure
esf-custom-distance-measure
, com seus valores correspondentes.As regras para nomes de cabeçalho são diferentes das regras para os identificadores do banco de dados do Snowflake. Os nomes de cabeçalho podem ser compostos por caracteres padrão ASCII mais visíveis (decimal 32 - 126), exceto os seguintes:
o caractere de espaço
(
)
,
/
:
;
<
>
=
"
?
@
[
]
\
{
}
_
Observe especificamente que o caractere sublinhado não é permitido em nomes de cabeçalho.
O nome e o valor do cabeçalho são delimitados por aspas simples, portanto, quaisquer aspas simples no nome ou valor do cabeçalho precisavam de um caractere de escape com a barra invertida.
Se o caractere de barra invertida for usado como um caractere literal dentro de um valor de cabeçalho, ele deve ter um caractere de escape.
Nos valores de cabeçalho, são permitidos tanto espaços como tabulações, mas os valores de cabeçalho não devem conter mais de um caractere de espaço em branco em uma linha. Esta restrição se aplica a combinações de caracteres do espaço em branco (por exemplo, um espaço seguido por uma tabulação), bem como a caracteres individuais do espaço em branco (por exemplo, dois espaços em linha).
Se o criador da função marcar a função como segura (com
CREATE SECURE EXTERNAL FUNCTION...
), então os cabeçalhos, os cabeçalhos de contexto, os cabeçalhos de contexto binário e o URL não são visíveis para os usuários da função.A soma dos tamanhos dos nomes de cabeçalho e valores de cabeçalho para uma função externa deve ser menor ou igual a 8 KB.
CONTEXT_HEADERS = ( context_function_1 [ , context_function_2 ...] )
Isso é semelhante a HEADERS, mas em vez de usar cadeias de caracteres constantes, vincula os resultados da função de contexto do Snowflake aos cabeçalhos HTTP. (Para obter mais informações sobre as funções de contexto do Snowflake, consulte: Funções de contexto).
Nem todas as funções de contexto são suportadas em cabeçalhos de contexto. São suportados os seguintes itens:
CURRENT_ACCOUNT()
CURRENT_CLIENT()
CURRENT_DATABASE()
CURRENT_DATE()
CURRENT_IP_ADDRESS()
CURRENT_REGION()
CURRENT_ROLE()
CURRENT_SCHEMA()
CURRENT_SCHEMAS()
CURRENT_SESSION()
CURRENT_STATEMENT()
CURRENT_TIME()
CURRENT_TIMESTAMP()
CURRENT_TRANSACTION()
CURRENT_USER()
CURRENT_VERSION()
CURRENT_WAREHOUSE()
LAST_QUERY_ID()
LAST_TRANSACTION()
LOCALTIME()
LOCALTIMESTAMP()
Quando os nomes das funções são listados na cláusula CONTEXT_HEADERS, os nomes das funções não devem ficar entre aspas.
O Snowflake anexa
sf-context
ao cabeçalho antes de ser escrito para a solicitação HTTP.Exemplo:
CONTEXT_HEADERS = (current_timestamp)
Neste exemplo, o Snowflake escreve o cabeçalho
sf-context-current-timestamp
na solicitação de HTTP.Os caracteres permitidos nos nomes e valores de cabeçalho de contexto são os mesmos que os caracteres permitidos em nomes e valores de cabeçalho personalizados.
Funções de contexto podem gerar caracteres que são ilegais em valores de cabeçalho HTTP, incluindo (sem se limitar):
nova linha
Ä
Î
ß
ë
¬
±
©
®
O Snowflake substitui cada sequência de um ou mais caracteres ilegais por um caractere de espaço. (A substituição é por sequência, não por caractere).
Por exemplo, suponha que a função de contexto CURRENT_STATEMENT() retorne:
select /*ÄÎß묱©®*/ my_external_function(1);
O valor enviado em
sf-context-current-statement
é:select /* */ my_external_function(1);
Para garantir que os serviços remotos possam acessar o resultado original (com caracteres ilegais) da função de contexto mesmo que os caracteres ilegais tenham sido substituídos, o Snowflake também envia um cabeçalho de contexto binário que contém o resultado da função de contexto codificado em base64.
No exemplo acima, o valor enviado no cabeçalho de Base64 é o resultado da chamada:
base64_encode('select\n/ÄÎß묱©®/\nmy_external_function(1)')
O serviço remoto é responsável pela decodificação do valor de Base64, se necessário.
Cada um desses cabeçalhos de Base64 é nomeado de acordo com a seguinte convenção:
sf-context-<context-function>-base64
No exemplo acima, o nome do cabeçalho seria
sf-context-current-statement-base64
Se nenhum cabeçalho de contexto for enviado, então nenhum cabeçalho de contexto de Base64 será enviado.
Se as linhas enviadas para uma função externa forem divididas em vários lotes, então todos os lotes contêm os mesmos cabeçalhos de contexto e os mesmos cabeçalhos de contexto binário.
MAX_BATCH_ROWS = integer
Isto especifica o número máximo de linhas em cada lote enviado ao serviço de proxy.
O objetivo deste parâmetro é limitar os tamanhos dos lotes para serviços remotos que têm restrições de memória ou outras limitações. Este parâmetro não é um parâmetro de ajuste de desempenho. Este parâmetro especifica um tamanho máximo, não um tamanho recomendado.
Se você não especificar MAX_BATCH_ROWS, o Snowflake estima o tamanho ideal do lote e o utiliza.
O Snowflake recomenda deixar este parâmetro sem ajuste, a menos que o serviço remoto exija um limite.
COMPRESSION = compression_type
Se esta cláusula for especificada, a carga de JSON é comprimida quando enviada do Snowflake para o serviço de proxy, e quando enviada de volta do serviço de proxy para o Snowflake.
Os valores válidos são:
NONE
.GZIP
.DEFLATE
.AUTO
.Em AWS,
AUTO
é equivalente aGZIP
.No Azure,
AUTO
é equivalente aNONE
.Em GCP,
AUTO
é equivalente aNONE
.
O Amazon API Gateway compacta/descompacta automaticamente as solicitações. Para obter mais informações sobre a compactação e descompactação do Amazon API Gateway, consulte: https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-gzip-compression-decompression.html
Para obter mais informações sobre compressão e descompressão para outros serviços de proxy de plataformas de nuvem, consulte a documentação para essas plataformas de nuvem.
Padrão: o padrão é
AUTO
.REQUEST_TRANSLATOR = request_translator_udf_name
Isto especifica o nome da função do tradutor de solicitação. Para obter mais informações, consulte Uso de tradutores de solicitação e resposta com dados para um serviço remoto.
RESPONSE_TRANSLATOR = response_translator_udf_name
Isto especifica o nome da função do tradutor de resposta. Para obter mais informações, consulte Uso de tradutores de solicitação e resposta com dados para um serviço remoto.
Requisitos de controle de acesso¶
Uma função usada para executar este comando SQL deve ter os seguintes privilégios no mínimo:
Privilégio |
Objeto |
Notas |
---|---|---|
CREATE EXTERNAL FUNCTION |
Esquema |
Operating on functions also requires the USAGE privilege on the parent database and schema. |
Ou OWNERSHIP ou USAGE |
Integração de API |
Exigido para criar funções externas que façam referência a uma integração de API. |
Para instruções sobre como criar uma função personalizada com um conjunto específico de privilégios, consulte Criação de funções personalizadas.
Para informações gerais sobre concessões de funções e privilégios para executar ações de SQL em objetos protegíveis, consulte Visão geral do controle de acesso.
Notas de uso¶
Quando a compactação é usada, o Snowflake define os cabeçalhos HTTP como “Codificação de conteúdo” e “Codificação da aceitação”.
O(s) tipo(s) de argumento(s) e o tipo de retorno não pode(m) ser GEOGRAPHY.
Em relação aos metadados:
Atenção
Os clientes devem garantir que nenhum dado pessoal (exceto para um objeto do usuário), dados sensíveis, dados controlados por exportação ou outros dados regulamentados sejam inseridos como metadados ao usar o serviço Snowflake. Para obter mais informações, consulte Campos de metadados no Snowflake.
Instruções CREATE OR REPLACE <object> são atômicas. Ou seja, quando um objeto é substituído, o objeto antigo é excluído e o novo objeto é criado em uma única transação.
Exemplos¶
O exemplo seguinte mostra uma instrução CREATE EXTERNAL FUNCTION que é chamada por um serviço de proxy Amazon API Gateway:
CREATE OR REPLACE EXTERNAL FUNCTION local_echo(string_col VARCHAR)
RETURNS VARIANT
API_INTEGRATION = demonstration_external_api_integration_01
AS 'https://xyz.execute-api.us-west-2.amazonaws.com/prod/remote_echo';
Neste exemplo:
local_echo
é o nome chamado a partir de uma instrução SQL (por exemplo, você pode executarSELECT local_echo(varchar_column) ...;
.)string_col VARCHAR
contém o nome e o tipo de dados do(s) parâmetro(s) de entrada. Uma função externa pode ter 0 ou mais parâmetros de entrada.variant
é o tipo de dados do valor retornado pela função externa.O nome
demonstration_external_api_integration_01
é o nome da integração de API criada anteriormente na instrução CREATE API INTEGRATION.O URL
https://xyz.execute-api.us-west-2.amazonaws.com/prod/remote_echo
é a cadeia de caracteres que identifica o serviço e o recurso de proxy. Um comando HTTP POST é enviado para este URL.