同一 PostgreSQL 数据库的两个所有者

Posted

技术标签:

【中文标题】同一 PostgreSQL 数据库的两个所有者【英文标题】:Two owners of the same PostgreSQL database 【发布时间】:2011-01-02 20:32:28 【问题描述】:

是否可以使用 Postgresql 创建一个具有 2 个用户的数据库,这些用户充当数据库的所有者?

我可以创建一个组角色并将两个用户都添加到该组,然后使该组成为数据库的所有者,但这需要两个用户都必须在每个连接上手动设置他们的角色才能创建他们拥有的任何表其他用户可访问。有没有什么方法可以让组成为用户每次登录时的默认角色或任何其他方式来实现相同的目标?

【问题讨论】:

【参考方案1】:

不,每个数据库只能有一个所有者。如前所述,您可以拥有多个超级用户,或者您可以专门向随后继承的组角色授予权限。

您可能想查看http://blog.hagander.net/archives/70-Faking-the-dbo-role.html,以了解一种伪造与您所要求的类似的东西的方法。它并不完美,但对你来说可能已经足够了。它至少应该能够解决对象所有权问题。

【讨论】:

是的,这似乎符合我的要求。您能想到以这种方式工作的任何安全隐患吗? 不,应该没问题。我假设如果你让他们成为管理员,他们相信不会故意破坏东西。比如,如果用户有恶意,他仍然可以将他的角色恢复为原来的角色。【参考方案2】:

啊,找到了:PostgreSQL Docs: Chapter 20. Database Roles and Privileges

“具有 INHERIT 属性的成员角色自动拥有其所属角色的权限。”

CREATE ROLE joe LOGIN INHERIT;
CREATE ROLE admin NOINHERIT;
GRANT admin TO joe;

“在以 joe 角色连接后,数据库会话将立即使用直接授予 joe 的权限以及授予 admin 的任何权限,因为 joe “继承”了 admin 的权限。”

【讨论】:

正确,但由 joe 创建的表归 joe 而不是管理员所有,这意味着组中的任何其他用户都无权访问它们。 但是您可以让“管理员”拥有对所有表执行所有操作的权限,其中包括组中其他用户创建的表。 但是您仍然必须为您与用户建立的每个连接手动设置管理员角色,不是吗? 不,这就是 INHERIT 的意思。去阅读关于角色和权限的文档页面 - 很清楚。 “角色的成员可以通过两种方式使用组角色的权限。首先,组中的每个成员都可以显式地执行SET ROLE,以暂时“成为”组角色。” ... “其次,具有 INHERIT 属性的成员角色自动拥有其所属角色的权限。” 是的,他们拥有组的权限,但他们仍然是他们创建的任何表的唯一所有者。我已经调查了这条途径,实际上我在原始问题中进行了描述。理想情况下,我需要在每个客户端连接上自动执行设置角色 admin。

以上是关于同一 PostgreSQL 数据库的两个所有者的主要内容,如果未能解决你的问题,请参考以下文章

两个日期之间的月份 | PostgreSQL

一文全搞懂postgresql的权限

PostgreSQL 模式操作

PostgreSQL模式介绍

PostgreSQL 统计同一张表的多列

Postgresql:在playframework 1.x中选择两个日期之间的所有数据