Algumas vezes criei um usuário do PostgreSQL chamado user1 (PostgreSQL 9.4.9).
Eu quero descartar este usuário. Então, primeiro revogo todas as permissões em tabelas, sequências, funções, privilégios padrão e propriedade também:
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON SEQUENCES FROM user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON TABLES FROM user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM user1;
REVOKE ALL ON ALL SEQUENCES IN SCHEMA public FROM user1;
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM user1;
REVOKE ALL ON ALL FUNCTIONS IN SCHEMA public FROM user1;
REASSIGN OWNED BY user1 TO postgres;
No entanto, parece que um objeto permanece vinculado a este usuário em 2 bancos de dados:
postgres=# DROP ROLE user1;
ERROR: role "user1" cannot be dropped because some objects depend on it
DETAIL: 1 object in database db1
1 object in database db2
Até parece ser uma função:
postgres=# \c db1
You are now connected to database "db1" as user "postgres".
db1=# DROP ROLE user1;
ERROR: role "user1" cannot be dropped because some objects depend on it
DETAIL: privileges for function text(boolean)
1 object in database db2
Mas não consigo determinar qual objeto pertence ou está relacionado a user1.
Se eu pg_dump -s db1 | grep user1
não obtenho resultado! Poderia ser um objeto global?
Como posso identificar o objeto perdido?
Executei os comandos em cada banco de dados (db1 e db2). Não quero descartar objetos pertencentes a user1
, apenas quero reatribuir ou remover concessões para este usuário.
Resposta à pergunta feita
Para procurar a função na mensagem de erro e seu proprietário:
Relacionado:
Problema real
A mensagem de erro diz:
Não se trata de propriedade, mas de privilégios .
O manual para
DROP ROLE
:E para
ALTER DEFAULT PRIVILEGES
:Também parece que você executou apenas
REASSIGN OWNED
em um banco de dados, mas o manual instrui:Minha ênfase em negrito.
E você restringiu seus comandos com
IN SCHEMA public
. Solte essa cláusula para direcionar todo o banco de dados. Mas não se preocupe, há um...Solução simples com
DROP OWNED
Todos os objetos da função mudaram de propriedade
postgres
com o primeiro comando e estão seguros agora. A redação deDROP OWNED
é um pouco enganosa, pois também elimina todos os privilégios e privilégios padrão. O manual paraDROP OWNED
:Repita em todos os DBs relevantes, então você pode avançar para a matança:
A consulta abaixo lista objetos com proprietários. Para todos os privilégios, precisamos de mais.
Você precisa primeiro se conectar ao banco de dados. No seu caso seria
e
Em seguida, tente executar as instruções REVOKE ALL PRIVILEGES e REASSIGN OWNED/DROP OWNED novamente.