将db中的特定模式的所有内容授予PostgreSQL中的组角色

pun*_*ish 81 postgresql privileges database-design roles grant

使用PostgreSQL 9.0,我有一个名为"staff"的组角色,并希望在特定模式的表上授予此角色所有(或某些)特权.以下工作均不适用

GRANT ALL ON SCHEMA foo TO staff;
GRANT ALL ON DATABASE mydb TO staff;
Run Code Online (Sandbox Code Playgroud)

除非我在该特定表上授予所有表,否则 "staff"的成员仍然无法对模式"foo"中的各个表或(在第二个命令的情况下)对数据库中的任何表进行SELECT或UPDATE .

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

更新:借助serverfault.com的类似问题计算出来.

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA foo TO staff;
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 108

您找到了为给定模式中的所有现有表设置权限的简写.手册澄清:

(但请注意,这ALL TABLES包括视图外表).

大胆强调我的.使用序列作为列默认值serial实现nextval()列,并引用手册:

对于序列,此权限允许使用currvalnextval函数.

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

GRANT USAGE ON ALL SEQUENCES IN SCHEMA foo TO mygrp;
Run Code Online (Sandbox Code Playgroud)

注意: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 ...;
Run Code Online (Sandbox Code Playgroud)

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

默认权限应用于目标用户(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 ...;
Run Code Online (Sandbox Code Playgroud)

另请注意,pgAdmin III的所有版本都有一个微妙的错误,并在SQL窗格中显示默认权限,即使它们不适用于当前角色也是如此.FOR ROLE复制SQL脚本时,请务必手动调整子句.

  • @punkish:我要求我的precog徽章![该死,已经用于别的东西.](http://stackoverflow.com/badges/892/precognitive) (4认同)
  • 只是为了让您了解 Erwin,在您发布建议 10 分钟后,我需要它。就像您知道我要做什么一样...创建一个新表并发现它没有正确的权限。你的回答有救了。 (2认同)
  • @J86:仅适用于 *current* 数据​​库 - 执行命令的地方。 (2认同)

Bas*_*que 39

我的回答类似于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_;
Run Code Online (Sandbox Code Playgroud)

其中的使用是public指为每个新数据库/目录创建的默认模式的名称.如果您创建了架构,请使用您自己的名称替换.

访问架构

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

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

GRANT USAGE ON SCHEMA some_schema_ TO some_user_ ;
Run Code Online (Sandbox Code Playgroud)

摘自Postgres文档:

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

有关更多讨论,请参阅问题,对SCHEMA的使用权限究竟如何?.请特别注意Postgres专家Craig Ringer 的回答.

现有对象与未来

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

  • 除了上述两项授予外,还需要一项授予: GRANT USAGE ON SCHEMA public TO some_user_; (2认同)