0013 — GRANT automático ao powersync_role¶
Status: Aprovado · Responsável: Gustavo Madruga · Atualizado em: 2026-06-11 · Decidido em: 2026-05-26
Contexto¶
O powersync_role (user que o PowerSync usa para replicar) lê as tabelas com
SELECT. Mas tabelas criadas pelo user das migrations (user_vantroba) nascem
sem GRANT para ele — Postgres não propaga GRANT automático entre roles.
Sintoma: PowerSync para de replicar com permission denied for table (42501),
o cliente trava no sync e o reset do Powersync morre em SNAPSHOT_PRE.
Decisão¶
A migration V13 aplicou ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT
SELECT ON TABLES TO powersync_role rodando como user_vantroba — assim toda
tabela futura em public herda o GRANT. Como cinto de segurança, cada
migration que cria uma tabela bi_* nova adiciona um GRANT SELECT … TO
powersync_role explícito (no-op se o default já cobriu).
Consequências¶
- Tabelas
bi_*novas herdam oSELECTsem intervenção manual. - "Confia desconfiando": sempre conferir
\dp <tabela>antes de redeployar o PowerSync com a tabela nova nosync_rules.yaml. - Tabelas
xls_*não precisam (não sincronizam), mas ganham o GRANT sem custo.
Alternativas consideradas¶
- GRANT manual a cada tabela: fácil esquecer → 42501 em produção. O default privileges + cinto reduz o risco. Parcialmente descartado (vira o cinto).
- Rodar migrations como superuser: quebraria o isolamento de privilégios do banco. Descartado.