继承默认权限:角色 A 的*任何成员创建的每个表都可以由角色 B 读取

com*_*ist 8 postgresql

如果我这样做...

ALTER DEFAULT PRIVILEGES
    FOR ROLE engineering
    IN SCHEMA reference
    GRANT SELECT ON TABLES to analytics;
Run Code Online (Sandbox Code Playgroud)

我得到...

该语法运行并具有有效含义。它的实现方式是,每当engineering 角色创建一个表(在reference模式中)时,该角色的任何成员都reporting将自动拥有对该表的读取访问权限。但要使其发挥作用,您必须在创建表时以角色身份登录或模拟(set session authorizationset role) 。engineering

我理解postgres 实现这一点的方式背后的基本原理。他们希望每个角色/用户设置自己的默认值。默认值是一种方便的简写,因此用户不必为他们创建的每个表设置权限。Postgres 甚至允许某人为他们可以模拟的任何角色设置默认值(因此超级用户可以为每个人设置默认值)。这非常强大,但是 postgres 不想让它变得太强大。他们仍然希望人们必须为每个用户的默认值发出单独的命令。他们希望人们认真思考他们为他们提供这种便利的每一位用户。

但我想要 ...

但是,我已经认真考虑过,我确实想为整个团队提供这些便利。我想要一个命令,让工程团队中的每个用户都继承这些默认权限。然后,每次他们中的一个创建一个表时,每个报告成员都会自动读取该表。事实上,当我第一次发现可以包含该子句时,这就是我解释语法的方式FOR ROLE engineering。但默认值不会被继承。

或者,我也对一个解决方案感兴趣,无论谁(无论他们位于哪个团队)在模式中创建一个表reference,该角色的所有成员都可以读取该表reportingreporting因此,在这种变体中,即使我无法(直接)控制谁授予这些权限(以及为什么我想要这样做?),我仍然可以打开架构。如果我有这个解决方案,我仍然可以有效地将其限制为engineering团队成员(如果他们是架构中唯一具有创建权限的人)reference


问题

我是否遗漏了某些内容(例如替代语法)?或者还有其他解决方法吗?

我对任何解决方案(甚至构建自定义扩展)持开放态度,只要它不属于以下两个类别之一:

解决方案并没有真正设置“默认”

即每次团队成员engineering登录或创建表时,他们都必须执行一些额外的命令来处理权限(例如在启动会话时更改工程角色)

解决方案并没有真正继承到整个团队

即,您必须在单独的命令中为每个团队成员设置默认权限(并且记住每当添加新成员时都要执行此操作)


我已经做完作业了

以下问题(Stack Exchange 根据我的问题文本建议的)都无法满足我的细微需求。

这些问题是基本的(不知道默认权限或如何按预期使用它们):

这些问题与我的类似,但尚未得到解答:

这些对我想要做的事情进行了一些讨论,但没有提供解决方案:

Lau*_*lbe 1

你研究得很好,没有办法得到你想要的东西。

所以也许你应该改变你的要求。

我的建议是,所有这些用户都是某个角色(我们称之为角色tableowner)的成员,并且只有该角色拥有CREATE模式的权限。

因此,为了创建、更改或删除表,用户首先必须使用SET ROLE tableowner.

然后所有表都归该角色所有,并且单个表ALTER DEFAULT PRIVILEGES FOR ROLE tableowner ...就可以解决问题。