111

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

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;
4

2 回答 2

143

您找到了为给定模式中的所有现有表设置权限的简写。该手册阐明

(但请注意,这ALL TABLES被认为包括视图外部表)。

大胆强调我的。serialnextval()在序列上作为默认列实现,并引用手册

对于序列,此权限允许使用currvalandnextval函数。

因此,如果有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 ...;

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

默认权限适用于目标用户 ( 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 窗格中显示默认权限,即使它们不适用于当前角色。FOR ROLE复制 SQL 脚本时,请务必手动调整子句。

于 2012-04-27T15:46:18.900 回答
49

我的答案类似于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 文档的摘录:

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

有关更多讨论,请参阅问题,SCHEMA 上的 GRANT USAGE 到底是做什么的?. 请特别注意Postgres 专家Craig Ringer的回答

现有对象与未来

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

于 2014-07-06T06:29:46.117 回答