Postgres (Greenplum) 不允许用户角色自己创建 table

Postgres (Greenplum) disallow user role to create table as themselves

我们的数据库(Greenplum 6、Postgres 9.x)的设置方式使得某些人只能访问某些数据。为了在“项目”启动时管理它,为该项目创建了一个新模式。与此同时,还创建了两个新角色 project_roproject_fa,分别用于只读和完全访问。 (这些角色具有相应的创建和使用授权)。然后通过授予他们其中一个角色将人员添加到项目中。这种方法的问题似乎在于,现在,因为用户角色是“项目”角色的一部分,所以他们可以用自己的名字创建 table。这意味着他们的用户角色拥有 table、视图等。这使得其他用户无法读取这些 table 并且管理员无法与这些对象交互,因为它们由用户拥有,而不是由“项目”角色 (project-fa).

作为序言,由于我们的体系结构,我们部门内没有超级用户。

当用户角色属于具有正确权限的角色时,我想不出一种方法来阻止他们创建 table。所以我想要的是,当用户角色尝试创建时它不起作用。强迫他们扮演另一个角色 (set role project_fa)。简单地告诉他们他们需要在创建对象之前更改角色或之后更改其所有者不是一种选择,因为它容易出错并且不是一个可靠的解决方案。

这是否可以通过现在的角色设置方式实现,或者我们是否需要重新考虑我们的访问控制?

默认情况下,不会授予 project_ro 和 project_fa 角色对架构中新创建的对象的访问权限。创建对象的用户应将权限授予相应的 _ro 和 _fa 角色。但大多数用户在创建对象后并没有授予权限。

要解决此问题,请要求您的 DBA 安排一个脚本,该脚本可以定期将架构中所有 non-view 对象的正确权限授予架构相关的 _ro 和 _fa 角色。 project_fa 角色应该是所有 non-view 对象的所有者。

视图可以在内部访问多个模式中的表中的数据。如果视图所有者没有基础表的访问权限,则如果他们 运行 select 在该视图上,包括 gpadmin 在内的所有用户都会收到权限被拒绝的错误。因此,有权访问底层对象的人应该是视图的所有者。 select 可以将对视图的访问权限授予 _ro 和 _fa 角色。