O usuário de leitura
Como criar um usuário que o Postgres impede de escrever — e por que a garantia tem de vir do banco.
O agente conecta no banco do ERP com um usuário criado só para isso. A restrição não é uma promessa nossa: é uma configuração do Postgres, e o agente prova que ela está valendo antes de parear.
O SQL
Rode no banco do ERP, como administrador. Troque vr pelo nome do seu banco e
public, pdv pelos schemas que o seu ERP usa.
-- O agente lê com este usuário e nada além dele.
CREATE USER dashboard_leitura WITH PASSWORD 'troque-por-uma-senha-forte';
GRANT CONNECT ON DATABASE vr TO dashboard_leitura;
GRANT USAGE ON SCHEMA public, pdv TO dashboard_leitura;
GRANT SELECT ON ALL TABLES IN SCHEMA public, pdv TO dashboard_leitura;
-- tabelas criadas depois também:
ALTER DEFAULT PRIVILEGES IN SCHEMA public, pdv
GRANT SELECT ON TABLES TO dashboard_leitura;
-- A linha que faz o banco recusar a escrita, e não nós:
ALTER ROLE dashboard_leitura SET default_transaction_read_only = on;
Confira antes de sair da tela
-- deve responder 'on'
SELECT rolconfig FROM pg_roles WHERE rolname = 'dashboard_leitura';
Por que não usar o superusuário do ERP
Ele funciona, e é exatamente o que não se quer no servidor de produção de um cliente. O ponto não é desconfiar de quem instala — é que uma credencial com poder de escrita, guardada num arquivo de configuração num servidor de loja, continua tendo poder de escrita no dia em que aquele arquivo for lido por outra pessoa.
Como o agente confere
Ao parear, ele abre uma transação e tenta uma escrita trivial. Se ela passar, o agente para com erro e não pareia.
Isso parece exagero até o dia em que alguém corrige um problema de permissão concedendo direitos a mais e ninguém percebe. A partir daí a garantia que estava escrita no contrato não valia mais — e ninguém teria como saber.
A senha
Guarde a senha que você acabou de definir: ela é pedida na instalação, no
ERP_ORIGEM. Depois disso ela fica no arquivo de configuração do agente, no
servidor da loja, e nunca sobe para nós. Na saída do comando estado ela
aparece mascarada; nos registros, nunca aparece.