两个拥有相同PostgreSQL数据库的所有者

18

使用Postgresql可以创建一个数据库,其中有2个用户像所有者一样操作数据库吗?

我可以创建一个组角色,并将两个用户添加到该组中,然后使该组成为数据库的所有者,但这要求两个用户必须在每次连接时手动设置他们的角色,以使他们创建的任何表格对另一个用户可访问。 是否有任何方法可以使组成为用户每次登录时的默认角色或任何其他方式来实现相同的功能?

2个回答

18

不行,每个数据库只能有一个所有者。正如先前所述,您可以拥有多个超级用户,或者可以将权限授予特定的组角色,然后进行继承。

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


是的,这似乎做到了我想要的。您能想到以这种方式工作可能存在的任何安全隐患吗? - David Reynolds
不,那应该没问题。我假设如果你让他们成为管理员,就是信任他们不会故意破坏东西。比如说,如果用户有恶意,他仍然可以将自己的角色还原到原始状态。 - Magnus Hagander

8
啊,找到了:PostgreSQL文档:第20章 数据库角色和权限

"具有继承属性的成员角色自动拥有其所属角色的权限。"

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

“连接为joe角色后,数据库会话将具有直接授予joe的特权以及授予admin的任何特权,因为joe“继承”了admin的特权。”

是的,但是由Joe创建的表归Joe所有,而不是管理员,这意味着组中的任何其他用户都无法访问它们。 - David Reynolds
但是您可以拥有带有所有表上所有功能权限的“管理员”,其中包括群组中其他用户创建的表。 - Timothy
但是您仍然需要手动为每个与用户建立的连接设置管理员角色,对吧? - David Reynolds
不,这就是INHERIT的含义。去阅读一下关于角色和权限的文档页面吧 - 很清楚。一个角色的成员可以以两种方式使用组角色的特权。首先,组的每个成员都可以显式地执行SET ROLE来暂时“成为”组角色。 ... 其次,具有INHERIT属性的成员角色自动具有其所属角色的特权。 - Timothy
是的,他们拥有组的特权,但仍然是他们创建的任何表的唯一所有者。我已经调查过这个方法,在事实上,我在原始问题中描述了它。理想情况下,我需要发生的是在每个客户端连接时自动执行“set role admin”。 - David Reynolds
具有INHERIT属性的成员角色自动使用其成员角色特权,这意味着他们不需要明确地执行SET ROLE操作。 - Timothy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接