10.8 - Automatizando Tarefas com Funções
Fala, engenheiro(a) de automação! Já vimos o poder do Supabase para Auth, Storage e Realtime. Agora é hora de conhecer uma ferramenta incrível que vive dentro do nosso banco PostgreSQL: as Database Functions (Funções de Banco de Dados).
Imagine elas como pequenos robôs programáveis morando no seu banco. Você ensina uma tarefa para esse robô (uma função) e pode mandar ele executar essa tarefa sempre que quiser, direto pelo SQL ou pela API do Supabase!
Qual é a missão desses robôs?
Por que usar funções?
Reutilizar código SQL: Se você tem um pedaço de código SQL que usa sempre (tipo calcular a pontuação total do usuário), ao invés de repetir tudo, você cria uma função e chama ela quando precisar.
Lógica complexa: Para processos com vários passos, condições (IF/ELSE) ou loops (FOR/WHILE) no banco. Só SELECT, INSERT e UPDATE não dão conta de tudo.
Segurança: Dá pra liberar para um usuário só executar a função, sem dar acesso direto às tabelas por trás.
Performance: Processar direto no banco, onde os dados estão, costuma ser mais rápido que trazer tudo para o app e depois voltar.
Triggers (Gatilhos): Funções são a base para gatilhos que disparam ações automáticas em resposta a eventos (tipo, criar um perfil padrão quando um usuário novo é inserido). Isso é avançado, mas entender funções é o primeiro passo.
A linguagem dos robôs: SQL e PL/pgSQL
No PostgreSQL (o coração do Supabase), as funções podem ser escritas em:
SQL: Funções que rodam comandos SQL, ótimas para encapsular queries complexas.
PL/pgSQL: Linguagem procedural nativa do PostgreSQL, que adiciona programação ao SQL, permitindo:
Declarar variáveis;
Usar estruturas de controle (IF/ELSE, CASE);
Loops (FOR, WHILE);
Tratamento de erros;
É a escolha para funções mais elaboradas.
Como criar funções no Supabase?
Você pode fazer isso de dois jeitos:
Pelo SQL Editor usando o comando
CREATE FUNCTION
.Na seção Database -> Functions, que tem um editor visual (que gera o
CREATE FUNCTION
por baixo dos panos).
Exemplo básico de função PL/pgSQL:
CREATE OR REPLACE FUNCTION nome_da_funcao(param1 tipo1, param2 tipo2)
RETURNS tipo_de_retorno
LANGUAGE plpgsql
AS $$
DECLARE
variavel_local tipo;
BEGIN
-- lógica da função
RETURN resultado;
END;
$$;
Exemplos práticos
1. Função SQL simples — contar agentes ativos:
CREATE OR REPLACE FUNCTION contar_agentes_ativos()
RETURNS integer
LANGUAGE sql
AS $$
SELECT COUNT(*) FROM agentes WHERE ativo = true;
$$;
Use assim:
SELECT contar_agentes_ativos();
Retorna o número de agentes ativos.
2. Função PL/pgSQL — calcular idade pela data de nascimento:
CREATE OR REPLACE FUNCTION calcular_idade(data_nasc DATE)
RETURNS integer
LANGUAGE plpgsql
AS $$
BEGIN
RETURN date_part('year', age(now(), data_nasc));
END;
$$;
Use assim:
SELECT nome, calcular_idade(data_nascimento) AS idade FROM usuarios;
3. Função PL/pgSQL — dar bônus de habilidade (sem retorno):
CREATE OR REPLACE FUNCTION dar_bonus_habilidade(id_agente uuid, bonus integer)
RETURNS void
LANGUAGE plpgsql
AS $$
BEGIN
UPDATE agentes
SET nivel_habilidade = nivel_habilidade + bonus
WHERE id = id_agente;
END;
$$;
Use assim:
SELECT dar_bonus_habilidade('uuid-002', 2);
Atualiza o nível de habilidade do agente com o bônus.
Segurança e permissões
Quem cria a função é seu "dono". Outros usuários só podem executá-la se receberem permissão (GRANT EXECUTE
). O Supabase cuida de várias permissões automaticamente, especialmente para chamadas via API (veremos isso no próximo capítulo).
As funções no banco são ferramentas poderosas para automatizar, otimizar e organizar sua lógica diretamente onde os dados moram — seu banco PostgreSQL no Supabase.
Last updated