PostgreSQL 组角色

Cho*_*ens 6 postgresql

这不是“分组依据”问题。我正在为 postgres 中的权限而苦苦挣扎,因为我显然不明白组角色是如何工作的。事实证明,在 SO 上搜索这个很困难,因为我被有关 group by 的问题所困扰,这不是问题。

我一直在使用 postgres 来管理一系列的研究项目。这些数据库未连接到任何 Web 前端。我从 CSV 导入所有数据。在过去的几个月里,我一直是唯一的用户。这非常有效。我是数据库所有者,没有其他人需要关心。最近,我构建了一个复杂的数据库,其中包含来自多个来源的数据。由于涉及的表数量众多,每个数据源都有自己的架构,我创建了一系列方便的视图,以便更轻松地处理这些不同的数据集。这些模式应该只对所有用户只读,除了我自己。

这个项目需要其他几个人才能访问这个数据库。每个用户都有一个用户名/密码和一个单独的架构,他们可以在其中工作而不会弄乱公共架构。我希望能够控制对模式的访问,以便其他分析师“仅选择”保存原始数据的模式。但是,我希望数据库中的所有其他模式在访问方面或多或少地像公共模式一样起作用。这些模式的存在是为了逻辑结构,而不是为了控制访问。我希望每个人都能够读/写/创建/删除/等等。在不保存原始数据的这些其他模式中。

不幸的是,postgres 角色相当棘手,或者我理解得相当缓慢。由于新表是由不同用户创建的,因此设置起来很棘手。当我们添加新表时,我不得不手动重新运行授权访问命令。

更改默认权限似乎暗示我可以使用组角色来执行此操作,但是当我尝试这样做时,其他用户无法访问新表。似乎意味着我可以设置允许我管理访问权限的组角色,但到目前为止我还没有成功:

您只能更改将由您自己或您所属的角色创建的对象的默认权限。

我只是在寻找一些帮助来了解如何最好地利用组角色来控制对 Postgres 中模式/表/视图的访问。我不想每次添加新表时都手动授予访问权限,或者更糟的是,每次添加新用户时都手动授予访问权限。我希望能够将新用户添加到控制访问的更大组中。


根据给出的评论,我尝试使用以下语法。在这个例子中,有两个用户,achoens(我)和 mrubin(一个同事)。我可以作为两个用户登录。作为 achoens,我运行以下命令:

create schema foo;
alter default privileges in schema foo grant select on all tables to public;
select 1 into foo.test;
Run Code Online (Sandbox Code Playgroud)

我以 achoens 身份注销并以 mrubin 身份登录。然后我跑

select * from foo.test;
Run Code Online (Sandbox Code Playgroud)

返回权限错误。在本例中,Postgres 9.1 在 Windows 服务器上运行,但我在运行 Ubuntu 的家庭服务器上进行了尝试,并得到了相同的结果。我喜欢 postgres,但这使得在协作环境中使用变得更加困难,而不仅仅是让每个人都成为管理员,我不想这样做。

我还编辑了上述语法以引用名为分析师的用户组,achoens 和 mrubin 都是该用户组的成员。没有不同。用户 mrubin 无法读取愚蠢的小单行表。

Cra*_*ger 4

听起来您可能想要的是:

  • 创建一个角色来拥有所有公用表和模式,或者如果您确实永远是唯一一个完全控制主表的人,则可以使用您自己的角色。

  • 创建另一个角色,您打算授予对共享表和架构的只读访问权限。GRANT该角色权限用于GRANT SELECT ON ALL TABLES IN SCHEMA [x]每个共享模式。您可能还想ALTER DEFAULT PRIVILEGES确保该角色对这些模式中创建的任何新表也具有读取权限。

  • 现在,GRANT每个用户都具有只读访问角色的成员资格INHERIT

  • 对于私有模式,创建一个与用户的用户名相同的模式,CREATE SCHEMA [username] AUTHORIZATION [username]或者使用您创建模式的旧样式,然后ALTER SCHEMA ... OWNER TO

有关上述所有命令的详细语法,请参阅 postgresql 手册。从用户管理开始,这是更广泛的数据库管理主题的一部分,包括授权管理等。PostgreSQL 手册详细、全面且可读:强烈建议阅读它。