将所有db中的特定模式授予PostgreSQL中的组angular色

使用PostgreSQL 9.0,我有一个名为“staff”的组angular色,并希望在特定模式的表上授予此angular色的所有(或某些)特权。 以下都不是

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

“职员”的成员仍然无法对架构“foo”中的单个表或者(对于第二个命令的情况下)对数据库中的任何表进行SELECT或UPDATE更新, 除非我在该特定表上授予所有表。

我能做些什么让我和我的用户的生活更轻松?

更新: 在serverfault.com上的类似问题的帮助下找出它。

 GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA foo TO staff; 

您find了给定架构中所有现有表的简写。 手册阐明 :

(但请注意, ALL TABLES被视为包含视图外表 )。

大胆重视我的。 serial列在nextval()上作为列的默认值执行, 引用手册 :

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

所以如果有serial列的话,你也要在序列上授予USAGE (或者ALL PRIVILEGES

 GRANT USAGE ON ALL SEQUENCES IN SCHEMA foo TO mygrp; 

注意:Postgres 10或更高版本中的标识列使用不需要额外特权的隐式序列。 (考虑升级serial列。)

那么物体呢?

您还会对用户或模式的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 ...; 

这为将来自动创build的对象设置权限 – 但不能用于预先存在的对象。

默认权限适用于由目标用户创build的对象( FOR ROLE my_creating_role )。 如果该子句被省略,则默认为执行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窗格中显示默认权限,即使它们不适用于当前angular色。 确保在复制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是指为每个新的数据库/目录创build的默认模式的名称。 如果您创build了架构,请用您自己的名称replace。

访问模式

要访问一个模式,任何行动,用户必须被授予“使用”权利。 在用户可以select,插入,更新或删除之前,用户必须首先被授予对模式的“使用”。

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

 GRANT USAGE ON SCHEMA some_schema_ TO some_user_ ; 

摘自Postgres文档 :

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

有关更多讨论,请参阅问题, 对于SCHEMA的授权使用究竟是干什么的? 。 特别注意Postgres专家Craig Ringer 的答案 。

现有的对象与未来

这些命令只影响现有的对象。 您将来创build的表等将获得默认权限,直到您重新执行上面的这些行。 请参阅Erwin Brandstetter的其他答案,以更改默认值,从而影响未来的对象。