Capítulo 22 de 54

Database Cron (pg_cron): Agendamento Perfeito de Tarefas no SQL

No final do mês, você precisa rodar uma tarefa que analisa 50.000 clientes no banco e altera o status deles de ativo para vencido dependendo do histórico de pagamentos.

O erro de principiante é configurar uma Vercel Edge Function agendada (Cron Job) que puxa 50.000 registros para a memória da Vercel, processa um por um e devolve 50.000 chamadas de UPDATE pela internet para o banco. Resultado: Timeout e banco lento.

O Padrão Arquitetural B2B exige que a manutenção massiva dos dados seja executada por quem mais domina dados: o próprio banco, utilizando a extensão pg_cron.


1. O que é o pg_cron?

É uma extensão C de alta velocidade rodando dentro da engine do Postgres. Ele permite agendar tarefas usando a mesma sintaxe do Cron do Linux (ex: 0 3 * * * para rodar às 3h da manhã todos os dias).

Por estar dentro da nuvem do Supabase, o pg_cron executa SQL cru sem transitar um único byte pela internet externa, eliminando a dependência do servidor web e de proxies HTTP.


2. Padrões de Uso (Casos de Sucesso)

Sempre substitua Crons tradicionais pelo pg_cron em cenários que envolvem mutação maciça de tabelas e que não exijam chamadas para APIs externas.

Exemplo de Limpeza (Soft Deletes / Logs)

-- Ativa a extensão (se ainda não estiver ativa)
CREATE EXTENSION IF NOT EXISTS pg_cron;

-- Agenda a remoção de carrinhos de compra abandonados há mais de 30 dias (Roda todo domingo à meia-noite)
SELECT cron.schedule(
  'limpeza-carrinhos-abandonados', 
  '0 0 * * 0', 
  $$ DELETE FROM shopping_carts WHERE updated_at < now() - interval '30 days' $$
);

Exemplo Híbrido (Agendando Webhooks via pg_net)

E se a rotina mensal precisar notificar um sistema de faturamento externo? A beleza do Supabase é a interoperabilidade das extensões. Você pode usar o pg_cron para agendar uma varredura nas tabelas e, em seguida, usar a extensão pg_net (Postgres Networking) para disparar Webhooks Assíncronos a partir do próprio banco.


3. Os Limites da Extensão

O pg_cron é incrivelmente eficiente, mas há duas regras de ouro:

  1. Nunca use para envio massivo de e-mails diretos. O banco deve lidar com dados. Para e-mails ou processamento pesado de vídeos, use o pg_cron apenas para enfileirar as tarefas numa tabela, e faça uma Edge Function ou um sistema NestJS Worker externalizado consumir essa fila.
  2. Audite seus Logs de Cron. O Supabase disponibiliza a visualização das tarefas agendadas. Comandos pesados devem rodar de madrugada para evitar disputa por CPU (Locks) com transações ativas de usuários do sistema.

[!TIP] Se o objetivo for manipular ou limpar estritamente dados no banco (sem depender de APIs externas para validação lógica), o pg_cron elimina todo o custo de tráfego (egress) da Vercel e garante a execução confiável, à prova de Timeouts, com custo zero na fatura do Serverless.


Precisa de apoio técnico para a sua empresa?

Se a sua operação busca especialistas para modernização de sistemas legados ou desenvolvimento de sistemas sob medida com arquitetura de alta performance (Next.js e Supabase), conheça meus serviços de tecnologia ou fale diretamente comigo pelo WhatsApp.