将db中特定模式上的全部授予PostgreSQL中的组角色


91

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

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

除非我授予该特定表的全部权限,否则 “ staff”的成员仍无法对模式“ foo”中的单个表进行选择或更新,或者(对于第二个命令而言)无法访问数据库中的任何表。

我该怎么办才能使我和用户的生活更轻松?

更新:在serverfault.com的类似问题的帮助下解决了这个问题

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

Answers:


120

您发现了为给定架构中的所有现有表设置特权的快捷方式。该手册阐明

(但请注意,它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 ...;

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

默认特权适用于目标用户(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脚本时,请确保手动调整该子句。


2
如此一来,您就知道Erwin,在您发布建议后10分钟,我需要它。就像您知道我要做什么...创建一个新表并发现它没有正确的privs。您的答案来了。
朋克

5
@punkish:我需要我的precog徽章!该死的,那已经用于其他用途了。
Erwin Brandstetter

运行时ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT ALL PRIVILEGES ON TABLES TO staff;如何知道哪个数据库?SCHEMA foo可以存在于不同的数据库中?
J86

2
@ J86:仅适用于当前数据库-执行命令的位置。
欧文·布兰德斯特

1
@ErwinBrandstetter我可以将将来的表/序列的访问权限授予app_user(可读写),前提是表将由另一个专用的migration_user自动创建(在应用程序启动时运行迁移)?
lexeme

43

我的答案类似于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_;

使用publicthere表示为每个新数据库/目录创建的默认模式的名称。如果创建了架构,请替换为您自己的名称。

访问架构

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

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

GRANT USAGE ON SCHEMA some_schema_ TO some_user_ ;

摘自Postgres doc

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

有关更多讨论,请参阅问题:SCHEMA上的授权使用有什么用?。请特别注意Postgres专家Craig Ringer 的回答

现有物体与未来

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


1
除了以上两个授予之外,还需要另一个授予:SCHEMA上的GRANT USAGE public to some_user_;
刘宁

1
@NingLiu非常感谢您指出GRANT USAGE,并教了我这一点。我在答案中添加了一部分。
罗勒·布尔克

我一直在寻找SCHEMA上的免费使用。
罗勒·穆萨
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.