这个问题有很多几乎重复的地方,到目前为止我发现的都是错误的和/或不完整的,所以我觉得我们需要一个规范的答案。
在 PostgreSQL 中,如何将数据库的所有权限授予用户,而不授予他们 SUPERUSER 权限?
这包括所有表、序列、类型、触发器、索引、过程和当前在数据库中的任何其他对象,以及稍后由该用户或其他人在数据库中创建的任何对象。当然,它还包括在数据库中创建对象的能力。
这个问题有很多几乎重复的地方,到目前为止我发现的都是错误的和/或不完整的,所以我觉得我们需要一个规范的答案。
在 PostgreSQL 中,如何将数据库的所有权限授予用户,而不授予他们 SUPERUSER 权限?
这包括所有表、序列、类型、触发器、索引、过程和当前在数据库中的任何其他对象,以及稍后由该用户或其他人在数据库中创建的任何对象。当然,它还包括在数据库中创建对象的能力。
您所问的几乎不实用-您通常会为此使用超级用户。因为,引用手册:
和:
因此,如果非超级用户也拥有这些权限,则必须(直接或间接地)被授予所有允许创建对象的角色的成员资格。
授予超级用户角色的成员资格不会使该成员成为超级用户。
但是成员角色现在可以
SET ROLE
成为超级用户。可能是也可能不是你想要的。然后,作为所有者,他自己
admin_role
也GRANT
可以拥有任何额外的特权(可能已被撤销)。或者,您设置一个机制,将所有现有和未来对象的所有权分配给一个角色,并仅授予该角色的成员资格。对给定角色的所有对象执行此操作的快速方法是
REASSIGN OWNED
. 有关的:但是您是否也想授予系统目录中对象的所有权?
postgres
这些在默认设置中归超级用户所有。相反,我会使用需要“所有”权限的超级用户。并且只授予管理员角色所需的权限(包括
CREATEDB
和)。CREATEROLE
强大的管理员角色的秘诀(没有所有特权):