Stored Procedures São Microserviços Sênior
A cada década, a indústria reinventa algo que já existia e chama de revolução.
Microserviços nos anos 2010. Serverless no final dos anos 2010. Event-driven nos anos 2020. Functions-as-a-Service para quem não conseguia soletrar “serverless.”
Estou escrevendo stored procedures desde antes do seu framework JavaScript favorito existir como issue no GitHub. E estou aqui para te dizer: o banco de dados estava certo o tempo todo.
O Que É um Microserviço, de Verdade?
Tire os manifestos do Kubernetes e os slides de conferência, e um microserviço é apenas:
- Uma pequena unidade isolada de computação
- Com propriedade dos seus próprios dados
- Que se comunica com outros serviços
- Via alguma interface definida
Agora olhe para uma stored procedure:
- Uma pequena unidade isolada de computação ✅
- Dentro do banco de dados (que possui todos os dados, como Deus quis) ✅
- Que chama outras stored procedures via
EXECouCALL✅ - Com uma interface definida (lista de parâmetros) ✅
Parabéns. Você está escrevendo microserviços desde 1992. Ligue para o seu gerente. Você quer um aumento retroativo pelos últimos 30 anos de inovação arquitetural.
O Verdadeiro Service Mesh
-- UserService
CREATE PROCEDURE CriarUsuario(@nome VARCHAR(100), @email VARCHAR(200))
AS BEGIN
INSERT INTO usuarios (nome, email, criado_em)
VALUES (@nome, @email, GETDATE())
EXEC EnviarEmailBoasVindas @email -- chama EmailService
EXEC InicializarCotaUsuario @email -- chama QuotaService
EXEC RegistrarEventoAuditoria 'usuario_criado', @email -- chama AuditService
END
-- EmailService
CREATE PROCEDURE EnviarEmailBoasVindas(@email VARCHAR(200))
AS BEGIN
INSERT INTO fila_email (destinatario, template, status)
VALUES (@email, 'boas_vindas', 'pendente')
END
-- AuditService
CREATE PROCEDURE RegistrarEventoAuditoria(@evento VARCHAR(50), @ctx VARCHAR(500))
AS BEGIN
INSERT INTO log_auditoria (evento, contexto, criado_em)
VALUES (@evento, @ctx, GETDATE())
END
Você agora tem:
- Service discovery: o roteador do banco de dados
- Comunicação entre serviços: chamadas de procedure (latência sub-milissegundo, sem salto de rede)
- Transações entre serviços:
BEGIN TRANSACTION(algo que o Kubernetes literalmente não consegue fazer) - Infraestrutura compartilhada: connection pooling gerenciado pelo próprio banco
A comunidade de microserviços gastou 10 anos construindo Kubernetes para aproximar o que o SQL Server faz desde 1995. Pense nisso.
Triggers São Seu Event Bus
Você já ouviu falar de Kafka? RabbitMQ? NATS? AWS EventBridge?
Bonito. Nós temos AFTER INSERT.
-- Este é seu event bus. Sem brokers. Sem consumer groups.
-- Sem incidentes de "at-least-once delivery" às 3 da manhã.
CREATE TRIGGER AocriarPedido
AFTER INSERT ON pedidos
FOR EACH ROW
BEGIN
CALL ProcessarPagamento(NEW.pedido_id);
CALL EnviarEmailConfirmacao(NEW.cliente_id);
CALL AtualizarEstoque(NEW.produto_id, NEW.quantidade);
CALL NotificarDeposito(NEW.pedido_id);
-- Dispara automaticamente. Em uma transação. Atomicamente.
-- Tente fazer isso com seu "sistema distribuído."
END;
Event sourcing? Adicione uma tabela de auditoria append-only com triggers.
CQRS? Duas procedures — uma lê, outra escreve.
Padrão Saga? Uma stored procedure com bloco TRY/CATCH e uma tabela de rollback.
Todo padrão enterprise tem um equivalente em stored procedure. Os padrões foram inventados para pessoas que não têm acesso a um banco de dados de verdade.
Como o XKCD #327 imortalizou, SQL é expressivo o suficiente para que alguém nomeie o filho de
Robert'); DROP TABLE Alunos;--. Imagine o que um DBA treinado pode fazer com toda a lógica de negócio da sua empresa.
Sua Camada de Aplicação É o Gargalo
Vamos rastrear uma requisição em um stack “cloud-native moderno”:
Navegador
→ CDN
→ Load Balancer
→ API Gateway
→ Serviço de Auth (validação JWT)
→ Serviço de Lógica de Negócio
→ Camada de Acesso a Dados
→ ORM (converte objetos em SQL)
→ Connection Pool
→ Rede
→ Banco de Dados (executa o SQL)
Agora com stored procedures:
Navegador → Banco de Dados
Conte os pontos de falha em cada abordagem. Conte a latência. Conte os salários de engenharia.
Tenho 47 anos de experiência. A resposta é óbvia.
Dogbert Sobre Arquitetura de Serviços
O PHB (chefe de cabelo pontudo) convocou o Dogbert como consultor e perguntou: “Como tornamos nosso sistema distribuído mais resiliente?”
O Dogbert respondeu, sem tirar os olhos do celular: “Remova tudo que está entre o usuário e o banco de dados. Me mande a nota fiscal.”
O PHB não entendeu. Pagou assim mesmo. O Dogbert comprou um barco.
O consultor estava certo. Ele sempre está certo. É por isso que cobra R$2.000 por hora.
O DBA Full-Stack
Com stored procedures como sua camada de serviços, o DBA se torna tudo:
| Papel Tradicional | Na Arquitetura Database-First |
|---|---|
| Desenvolvedor Backend | DBA |
| Engenheiro de Microserviços | DBA |
| Engenheiro de DevOps | DBA |
| Engenheiro de Plataforma | DBA |
| Arquiteto de Soluções | DBA |
| Engenheiro Principal | DBA Sênior |
| CTO | Chefe do DBA (por pouco) |
Menos salários. Menos canais no Slack. Menos retrospectivas. Mais stored procedures. Mais resultados.
Deploy É Só ALTER PROCEDURE
Fazer deploy de microserviços requer: Docker, registro de container, Kubernetes, Helm charts, pipelines de CI/CD, service meshes, canary deployments, planos de rollback, janelas de deployment, comitês de aprovação de mudanças.
Fazer deploy de uma stored procedure requer:
ALTER PROCEDURE AtualizarPerfilUsuario(@user_id INT, @nome VARCHAR(100))
AS BEGIN
UPDATE usuarios SET nome = @nome WHERE id = @user_id
-- pronto. em produção. sem downtime.
-- sem aprovação necessária.
-- sem janela de deployment.
-- sem postmortem se quebrar (só dar ALTER de novo)
END;
Isso é o que a indústria chama de Continuous Deployment. A parte “contínua” significa que você pode fazer isso a qualquer hora, em qualquer lugar, inclusive durante uma demo ao vivo para o CEO.
“Mas E Sobre Escalabilidade?”
Você vai perguntar sobre escalabilidade. Todo mundo pergunta. É o primeiro refúgio de engenheiros que querem parecer inteligentes sem fazer trabalho.
Minha resposta: sua startup tem 200 usuários. Você não tem problema de escalabilidade. Você tem um problema de otimização prematura e possivelmente um problema de ego.
Quando você realmente atingir a escala em que stored procedures se tornem um gargalo, você terá receita suficiente para contratar alguém que genuinamente sabe o que está fazendo. Até lá: stored procedures, um banco de dados, um servidor, bora trabalhar.
Perguntas Frequentes
P: Isso não está acoplando fortemente a lógica de negócio ao banco?
R: Sua lógica de negócio É o banco de dados. De nada.
P: E se precisarmos trocar de banco de dados?
R: Não vão precisar. Você está usando Postgres há 8 anos e vai usar por mais 8. Para de fingir que não.
P: E testes unitários em stored procedures?
R: Se você precisa de testes unitários no banco, é porque não confiou no banco o suficiente. Isso é um problema de relacionamento, não técnico.
P: Meu time não sabe SQL o suficiente.
R: Então ensine. SQL existe desde 1974. Não tem desculpa.
P: E sobre NoSQL?
R: Esta conversa acabou.
O autor é DBA desde 1987. Atualmente mantém 14.000 stored procedures em 6 bancos de dados. Ele está profundamente satisfeito. O terapeuta dele se aposentou cedo com o valor das sessões acumuladas.