几周前,当我学习 PostgreSQL 安全性时,我试图做一些奇怪的事情(尽管不推荐)从 pgadmin 的对象浏览器中删除公共模式。幸运的是,我有我运行的所有命令和我运行的所有撤消命令,但我似乎仍然有一个我无法删除的角色对象。尝试 DROP ROLE test_role_11 时出现错误,但我似乎仍然在公共模式中有对象依赖关系。你能帮我找到查询以找出它是什么吗?给定第一个查询,您还可以帮我找到正确的 REVOKE 命令(或其他命令)以撤消依赖关系和/或特权吗?PUBLIC 似乎是它自己的挑战,而不是一个实际的角色,所以我不确定如何编写查询。我尝试过使用旧问题,但没有走得太远。
异常/错误:
无法删除角色“test_role_11”,因为某些对象依赖于它 详细信息:架构公共的特权
这是我运行的查询。
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;
这些没有为我的角色找到任何对象依赖项。
在查看了所有目录表之后,我能够找到一些具有该对象的 oid 的记录。但我还不确定如何处理这些信息。
所以事实证明,引用依赖(ref*)对象的依赖对象是 2200,这就是公共模式本身!所以我需要改变这个角色的所有权(也许)。
这是我学到的。依赖项的依赖项(父项),oid=2200,可以是任何对象类型。所以很难弄清楚它在哪个表中。还有两个表具有依赖关系。此依赖项不在 pg_depend!
在 PostgreSQL 中,数据库对象的依赖关系在系统表 pg_depend 中进行跟踪。还有另一个系统表 pg_shdepend,它跟踪在集群中存在的所有数据库之间共享的对象的依赖关系。
这解决了问题!并且在此之后能够 DROP ROLE test_role_11 。