前段时间我创建了一个名为user1 (PostgreSQL 9.4.9) 的 PostgreSQL 用户。
我想删除这个用户。所以我首先撤销了对表、序列、函数、默认权限和所有权的所有权限:
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;
但是,在 2 个数据库中,一个对象似乎仍然与该用户相关联:
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
它甚至似乎是一个函数:
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
但我无法确定哪个对象拥有或与 user1 相关。
如果我pg_dump -s db1 | grep user1
没有结果!它会是一个全局对象吗?
如何识别丢失的对象?
我已经在每个数据库(db1 和 db2)中执行了命令。我不想删除 拥有的对象user1
,只想重新分配或删除此用户的授权。
回答问题
要在错误消息中查找函数及其所有者:
有关的:
实际问题
错误消息说:
这不是关于所有权,而是关于特权。
手册
DROP ROLE
:对于
ALTER DEFAULT PRIVILEGES
:看起来您只
REASSIGN OWNED
在一个数据库中执行,但手册指示:大胆强调我的。
你用 . 限制了你的命令
IN SCHEMA public
。删除该子句以针对整个数据库。但别担心,有一个...简单的解决方案
DROP OWNED
postgres
所有角色的对象都使用第一个命令更改了所有权,现在是安全的。的措辞DROP OWNED
有点误导,因为它也摆脱了所有特权和默认特权。手册DROP OWNED
:在所有相关的数据库中重复,然后你可以进入杀戮:
下面的查询列出了具有所有者的对象。对于所有特权,我们实际上需要更多。
您需要先连接到数据库。在你的例子中,那将是
和
然后尝试再次运行 REVOKE ALL PRIVILEGES 和 REASSIGN OWNED/DROP OWNED 语句。