Sou bastante novo nas permissões do postgres. Estou trabalhando com um servidor postgres para adicionar/remover bancos de dados como parte de um fluxo de trabalho. Cada banco de dados precisa ter uma função associada que possa fazer tudo dentro desse banco de dados, mas nada fora dele. Até agora, estou funcionando, onde crio um banco de dados e uma função, e dou à função (o que acho que são) as permissões corretas. Isso parece estar funcionando bem.
Este é o fluxo de trabalho:
- Criar banco de dados A
- Crie a função A e limite suas permissões ao banco de dados A
- Criar banco de dados B
- Crie a função B e limite suas permissões ao banco de dados B
No entanto, na etapa em que crio o banco de dados B, a função A recebe de alguma forma permissões no banco de dados B. Isso significa que, quando mais tarde eu removo o banco de dados A e sua função A associada, recebo um erro porque a função A tem objetos que dependem dele:
role "role A" cannot be dropped because some objects depend on it
Detail: 4 objects in database database B
Ao consultar a pg_catalog.pg_class
tabela no banco de dados B logo após criá-la, posso ver que a função A está lá:
{postgres=arwdDxt/postgres,"\"role a\"=arwdDxt/postgres"}
Alguma idéia do que está errado e, mais importante, como evitá-lo?
--- EDITAR ---
Aqui está o SQL que executo para criar o banco de dados e a função:
CREATE ROLE roleA WITH LOGIN PASSWORD 'password' NOINHERIT;
ALTER DATABASE databaseA OWNER TO roleA;
REVOKE ALL PRIVILEGES ON SCHEMA public FROM roleA;
REVOKE ALL PRIVILEGES ON DATABASE databaseA FROM PUBLIC;
GRANT GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO roleA;
Tentei várias combinações de outras permissões, mas não consigo fazer funcionar com as permissões necessárias. Tentei não fazer as instruções REVOKE
and GRANT
, mas isso também não funciona.
Finalmente cheguei ao fundo disso. Como parte do fluxo de trabalho, eu estava executando
pg_dump
a criação de um backup de um banco de dados e restaurando-o posteriormente.pg_dump
estava adicionando umGRANT
comando ao arquivo de backup para a função A, fazendo com que ela ganhasse privilégios no banco de dados B quando foi restaurada.Ao passar
--no-acl
parapg_dump
na hora de criar o backup, ele não coloca maisGRANT
lá e o problema é resolvido.