Todo SaaS atende vários clientes com uma base de código só. A parte difícil não é essa — é garantir que o dado de um cliente jamais apareça para outro, incluindo quando um desenvolvedor cansado esquecer uma condição numa consulta.

A diferença entre um SaaS que aguenta auditoria e um que aguenta até o primeiro incidente está inteira nessa garantia. E ela é decisão de arquitetura tomada antes da primeira linha de código, porque refazer depois custa mais que o produto.

O jeito ingênuo e por que ele quebra

A abordagem que aparece primeiro é uma coluna identificando o cliente em cada tabela, e um filtro por essa coluna em cada consulta.

Funciona. Enquanto ninguém esquecer.

O problema é estrutural: a garantia depende de disciplina humana aplicada em centenas de pontos, e basta falhar em um. O relatório novo, a consulta de exportação, o endpoint de administração que alguém criou para depurar. Nenhum desses erros aparece em teste — porque em ambiente de desenvolvimento costuma existir um cliente só, e com um cliente só o filtro esquecido não muda o resultado.

O defeito só se manifesta em produção, com dado real de gente real. É a pior categoria de bug que existe.

Três abordagens, e o que cada uma custa

Um banco de dados por cliente. Isolamento máximo: não há consulta que atravesse. O custo é operacional e cresce por cliente — cada migração de estrutura precisa rodar em todos, backup e monitoramento se multiplicam, e conectar-se ao banco certo vira responsabilidade da aplicação. Faz sentido com poucas dezenas de clientes grandes, ou quando o contrato exige separação física.

Um esquema por cliente, no mesmo banco. Meio-termo: separação lógica forte, operação mais simples que N bancos. Ainda multiplica o trabalho de migração, e alguns bancos degradam com milhares de esquemas.

Uma base compartilhada com isolamento em nível de registro. Todos os clientes nas mesmas tabelas, com a garantia de isolamento imposta pelo próprio banco de dados — não pela consulta que o desenvolvedor escreveu. Escala melhor e é a que exige mais rigor de arquitetura.

O que muda quando o banco impõe a regra

A diferença essencial da terceira abordagem não é onde o dado fica. É quem garante.

Quando a regra vive no banco, a consulta que esqueceu o filtro não devolve dado do outro cliente: ela devolve vazio. O erro vira um bug visível de "sumiu registro", que aparece no primeiro teste, em vez de um vazamento silencioso que ninguém percebe.

Isso muda a natureza do risco. Continua sendo possível errar — mas o erro deixa de ser catastrófico e passa a ser chato. É uma troca excelente.

O mesmo raciocínio vale para o outro lado: a identidade do cliente na requisição precisa vir de fonte confiável — do token de autenticação, nunca de um parâmetro que o cliente manda. Parece óbvio escrito assim; é surpreendentemente comum encontrar o contrário.

O caso que quase todo mundo esquece

Modelagem multi-tenant costuma assumir que cada pessoa pertence a um cliente. Aí o produto cresce e aparece a rede: um grupo com várias unidades, onde a mesma pessoa acessa mais de uma.

Se essa possibilidade não foi considerada na modelagem, a saída improvisada é criar uma conta por unidade — mesma pessoa, três logins, três senhas. Funciona e é ruim: o usuário odeia, o suporte sofre, e a auditoria não consegue dizer quem fez o quê.

Vale gastar meia hora, no início, perguntando: uma pessoa pode legitimamente pertencer a mais de um cliente? Se a resposta for talvez, modele para sim. O custo agora é uma tabela de associação; depois, é migração de dados com usuário em produção.

Como testar isolamento

Teste de isolamento não é teste de funcionalidade — é teste de ausência. Ele afirma que algo não aparece.

Na prática: crie dois clientes com dados parecidos, autentique como o primeiro, execute a operação e verifique que nenhum registro do segundo aparece. Depois repita ao contrário — porque uma regra de visibilidade pode funcionar num sentido e falhar no outro, e um teste só encontraria metade do problema.

Esses testes precisam rodar contra banco de dados real, não contra simulação. Toda a garantia mora no comportamento do banco; um dublê devolve o que foi programado para devolver e passa mesmo com a regra desligada.

O sinal de que alguém pensou nisso

Se você está avaliando comprar ou construir um SaaS, uma pergunta separa quem pensou de quem improvisou:

"O que acontece se um desenvolvedor esquecer o filtro de cliente numa consulta?"

Se a resposta for "não acontece porque revisamos o código", a garantia é a boa vontade de quem revisa numa quinta-feira à noite. Se a resposta descrever um mecanismo — o banco recusa, a consulta volta vazia, uma verificação automatizada reprova — existe arquitetura ali.


Como aplicamos isso: isolamento imposto pelo banco, identidade vinda do token, e testes de ausência rodando contra banco real. Veja engenharia de software ou fale com um especialista.