Pular para conteúdo

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 o SELECT sem intervenção manual.
  • "Confia desconfiando": sempre conferir \dp <tabela> antes de redeployar o PowerSync com a tabela nova no sync_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.