Semanas atrás, quando eu estava aprendendo a segurança do PostgreSQL, estava tentando fazer algumas coisas estranhas (embora não recomendadas) para remover o esquema público do navegador de objetos no pgadmin. Felizmente, tenho todos os comandos que executei e todos os comandos de desfazer que executei, mas ainda pareço ter um objeto de função que não consigo descartar. Estou recebendo um erro ao tentar DROP ROLE test_role_11, mas ainda pareço ter dependências de objeto no esquema público. Você pode me ajudar a encontrar a consulta para descobrir o que é? Você também pode me ajudar a encontrar o comando REVOKE correto (ou outro) para desfazer as dependências e/ou privilégios, dada a primeira consulta? PUBLIC parece ser seu próprio desafio e não uma função real, então não tenho certeza de como escrever a consulta. Eu tentei usar perguntas antigas, mas não cheguei muito longe.
Exceção/Erro:
a função "test_role_11" não pode ser descartada porque alguns objetos dependem dela DETALHE: privilégios para o esquema público
Aqui estão as consultas que fiz.
CREATE ROLE test_role_11
--NOSUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT NOLOGIN NOREPLICATION NOBYPASSRLS
REVOKE ALL ON ALL TABLES IN SCHEMA pg_catalog FROM public, me;
--GRANT ALL ON ALL TABLES IN SCHEMA pg_catalog TO public, me;
GRANT SELECT ON ALL TABLES IN SCHEMA pg_catalog TO test_role_11;
--REVOKE SELECT ON ALL TABLES IN SCHEMA pg_catalog FROM test_role_11;
GRANT test_role_11 TO me
--REVOKE object_browser FROM me;
--GRANT SELECT ON TABLE aaa IN SCHEMA pg_catalog TO test_role_11;
GRANT SELECT ON TABLE pg_catalog."aaa" TO test_role_11;
GRANT SELECT ON TABLE staging."aaa" TO test_role_11;
GRANT SELECT ON TABLE pg_database TO test_role_11;
Eles não encontraram nenhuma dependência de objeto para minha função.
Localizar objetos vinculados a uma função do PostgreSQL
Depois de procurar em todas as tabelas do catálogo, consegui encontrar alguns registros com o oid desse objeto. Mas ainda não tenho certeza do que fazer com essa informação.
Então acontece que o objeto dependente que faz referência ao objeto de dependência (ref*) é 2200, que é o próprio esquema público! Então eu preciso mudar a propriedade dessa função (talvez).
Aqui está o que eu aprendi. O dependente (pai), sendo oid=2200, da dependência pode ser de qualquer tipo de objeto. Portanto, é complicado descobrir em qual tabela está. Há também duas tabelas que possuem as dependências. Esta dependência não estava no pg_depend!
No PostgreSQL as dependências dos objetos do banco de dados são rastreadas na tabela do sistema pg_depend. Há também outra tabela de sistema pg_shdepend que rastreia as dependências de objetos que são compartilhados em todos os bancos de dados presentes no cluster.
Isso resolveu o problema! E foi capaz de DROP ROLE test_role_11 depois disso.