由于默认权限,PostgreSQL删除角色失败

时间:2012-03-23 14:27:47

标签: postgresql sql-drop

我正在尝试删除一个角色'xyz',该角色以前是具有相同名称'xyz'的架构的所有者。我更改了架构所有权,如下所示,并运行重新分配的所有权以防万一(尽管所有表都是由具有超级用户权限的其他用户创建的)。所以我运行所有这些:

alter schema xyz owner to postgres;
reassign owned by xyz to postgres;
alter default privileges in schema seeds revoke all on tables from xyz cascade;
alter default privileges in schema seeds revoke all on sequences from xyz cascade;
alter default privileges in schema seeds revoke all on functions from xyz cascade;

仍然收到错误:

drop role xyz;
ERROR:  role "xyz" cannot be dropped because some objects depend on it
DETAIL:  owner of default privileges on new relations belonging to role xyz in schema xyz

另外,仅供参考:

postgres=# \du rsi
List of roles
Role name |   Attributes   | Member of   
-----------+----------------+-----------
rsi       | No inheritance | {}

我错过了什么?任何帮助,将不胜感激!谢谢!

2 个答案:

答案 0 :(得分:18)

取自ALTER DEFAULT PRIVILEGES上的PostgreSQL documentation,注释部分:

  

如果您希望删除已更改默认权限的角色,则必须撤消其默认权限的更改,或使用DROP OWNED BY删除该角色的默认权限条目。

此案例中有关DROP OWNED BY的文档中的另一个worthy mention也是

  

由于DROP OWNED仅影响当前数据库中的对象,因此通常需要在每个包含要删除的角色所拥有的对象的数据库中执行此命令。

因此,您的里程可能会有所不同,这意味着您可能需要在更多数据库中发出声明。

收到问题中提到的相同消息后,我尝试了DROP OWNED BY语句并且它有效。希望这有帮助!

答案 1 :(得分:0)

首次运行命令:

DROP ROLE xyz;

然后:

{{1}}

阅读有关Drop Owned By的PostgreSQL文档。