Introdução a UDFs de SQL

Você pode escrever o manipulador para uma função definida pelo usuário (UDF) em SQL. Os tópicos desta seção descrevem como criar e escrever um manipulador de SQL. Você também encontrará exemplos.

Para uma introdução às UDFs, incluindo uma lista de linguagens na qual você pode escrever um manipulador de UDF, consulte Visão geral das funções definidas pelo usuário.

Quando você tiver um manipulador, você criará a UDF com SQL. Para obter mais informações sobre como usar SQL para criar ou chamar uma UDF, consulte Criação de uma UDF ou Como chamar uma UDF.

Nota

Para limitações relacionadas a SQLmanipuladores de UDF, consulte Limitações de SQL da UDF.

Neste tópico:

Como funciona um manipulador de SQL

Quando um usuário chama uma UDF, o usuário passa o nome e os argumentos da UDF para o Snowflake. Snowflake chama o código do manipulador associado (com argumentos, se houver) para executar a lógica da UDF. O método do manipulador então retorna a saída para o Snowflake, que a passa de volta para o cliente.

A definição da função pode ser uma expressão SQL que retorna um valor escalar (isso é, único) ou, se definida como uma função de tabela, um conjunto de linhas.

Exemplo

O código no exemplo a seguir cria uma UDF chamada area_of_circle contendo o código do manipulador que calcula a área de um círculo a partir do valor do raio recebido pela UDF como um argumento.

CREATE FUNCTION area_of_circle(radius FLOAT)
  RETURNS FLOAT
  AS
  $$
    pi() * radius * radius
  $$
  ;
Copy

Uso geral

Uma UDF de SQL avalia uma expressão arbitrária de SQL e retorna o(s) resultado(s) da expressão.

A definição da função pode ser uma expressão SQL que retorna um valor escalar (isso é, único) ou, se definida como uma função de tabela, um conjunto de linhas.

Requisitos de segurança/privilégio para UDFs de SQL

Se uma definição de função se refere a uma tabela não qualificada, essa tabela é resolvida no esquema que contém a função. Uma referência a outro objeto de esquema (por exemplo, uma tabela, exibição ou outra função) requer que o proprietário da função tenha privilégios para acessar esse objeto de esquema. O invocador da função não precisa ter acesso aos objetos referenciados na definição da função, mas precisa apenas do privilégio de usar a função.

Por exemplo, um administrador possui uma tabela chamada users contendo dados sensíveis que não são de acesso geral, mas o administrador pode expor a contagem total de usuários através de uma função para a qual outros usuários têm privilégios de acesso:

use role dataadmin;

desc table users;

+-----------+--------------+--------+-------+---------+-------------+------------+--------+------------+---------+
| name      | type         | kind   | null? | default | primary key | unique key | check  | expression | comment |
|-----------+--------------+--------+-------+---------+-------------+------------+--------+------------+---------|
| USER_ID   | NUMBER(38,0) | COLUMN | Y     | [NULL]  | N           | N          | [NULL] | [NULL]     | [NULL]  |
| USER_NAME | VARCHAR(100) | COLUMN | Y     | [NULL]  | N           | N          | [NULL] | [NULL]     | [NULL]  |
  ...
  ...
  ...
+-----------+--------------+--------+-------+---------+-------------+------------+--------+------------+---------+

create function total_user_count() returns number as 'select count(*) from users';

grant usage on function total_user_count() to role analyst;

use role analyst;

-- This will fail because the role named "analyst" does not have the
-- privileges required in order to access the table named "users".
select * from users;

FAILURE: SQL compilation error:
Object 'USERS' does not exist.

-- However, this will succeed.
select total_user_count();

+--------------------+
| TOTAL_USER_COUNT() |
|--------------------+
| 123                |
+--------------------+
Copy

Para obter mais informações sobre o uso de funções e privilégios para gerenciar o controle de acesso, consulte Visão geral do controle de acesso.