Grant all on a specific schema in the db to a group role in PostgreSQL

Using PostgreSQL 9.0, I have a group role called "staff" and would like to grant all (or certain) privileges to this role on tables in a particular schema. None of the following work

GRANT ALL ON SCHEMA foo TO staff;
GRANT ALL ON DATABASE mydb TO staff;

Members of "staff" are still unable to SELECT or UPDATE on the individual tables in the schema "foo" or (in the case of the second command) to any table in the database unless I grant all on that specific table.

What can I do make my and my users' lives easier?

Update: Figured it out with the help of a similar question on serverfault.com.

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA foo TO staff;
189647 次浏览

您找到了为给定模式中的所有 存在表设置特权的简写:

(but note that ALL TABLES is considered to include 观点 and 国外的桌子).

大胆的强调我的。 serial列是用 nextval()实现的,按照默认的列顺序,引用说明书:

对于序列,这种特权允许使用 currvalnextval函数。

因此,如果有 serial列,您还需要在 序列上授予 USAGE(或 ALL PRIVILEGES)

GRANT USAGE ON ALL SEQUENCES IN SCHEMA foo TO mygrp;

Note: 身分证明文件栏 in Postgres 10 or later use implicit sequences that don't require additional privileges. (Consider upgrading serial columns.)

新的对象呢?

你也会对 对于用户或模式,< strong > DEFAULT PRIVILEGES 感兴趣:

ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT ALL PRIVILEGES ON TABLES TO staff;
ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT USAGE          ON SEQUENCES TO staff;
ALTER DEFAULT PRIVILEGES IN SCHEMA foo REVOKE ...;

这会为将来自动创建的对象设置特权,但不会为已存在的对象设置特权。

默认特权是应用于目标用户(FOR ROLE my_creating_role)创建的对象的 only。如果省略该子句,则默认为执行 ALTER DEFAULT PRIVILEGES的当前用户。明确地说:

ALTER DEFAULT PRIVILEGES FOR ROLE my_creating_role IN SCHEMA foo GRANT ...;
ALTER DEFAULT PRIVILEGES FOR ROLE my_creating_role IN SCHEMA foo REVOKE ...;

另请注意,所有版本的 pgAdmin III 在 SQL 窗格中都有一个微妙的 bug 和 展示默认权限,即使它们不适用于当前角色。在复制 SQL 脚本时,一定要手动调整 FOR ROLE子句。

我的答案类似于 这个在 ServerFault.com 上

保守

如果您希望比授予“所有特权”更为保守,那么您可能想尝试更多类似的东西。

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO some_user_;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO some_user_;

这里使用的 public是指为每个新数据库/目录创建的默认模式的名称。如果创建架构,则使用您自己的名称替换。

对架构的访问

对于任何操作,要访问模式,必须授予用户“使用”权限。在用户可以选择、插入、更新或删除之前,必须首先向用户授予模式的“用法”。

当你第一次使用 Postgres 时,你不会注意到这个要求。默认情况下,每个数据库都有一个名为 public的第一个模式。默认情况下,每个用户都被自动授予该特定模式的“使用”权限。添加其他架构时,必须显式授予使用权限。

GRANT USAGE ON SCHEMA some_schema_ TO some_user_ ;

摘自 Postgres 医生:

对于模式,允许访问包含在指定模式中的对象(假设对象自己的特权要求也得到满足)。本质上,这允许被授权方在模式中“查找”对象。没有这个权限,仍然可以查看对象名称,例如通过查询系统表。此外,在撤销此权限之后,现有的后端可能有以前执行过此查找的语句,因此这不是防止对象访问的完全安全的方法。

更多的讨论见问题,在模式上使用授权具体做什么?。请特别注意由 Postgres 专家 克雷格 · 林格答案

现有对象与未来

这些命令只影响现有对象。在重新执行上面的代码行之前,您在将来创建的表和其他表都将获得默认特权。请参阅 另一个答案来自 Erwin Brandstetter以更改默认值,从而影响将来的对象。