提问者:小点点

将数据库中特定架构上的所有内容授予PostgreSQL中的组角色


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

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

“staff”的成员仍然无法选择或更新架构“foo”中的各个表,或者(在第二个命令的情况下)数据库中的任何表,除非我对该特定表授予全部权限。

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

更新:在serverfault上的一个类似问题的帮助下解决了这个问题。通用域名格式。

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

共2个答案

匿名用户

您找到了为给定架构中的所有现有表设置权限的简写方法。该手册阐明:

(但请注意,所有表都被视为包含视图和外部表)。

我的<代码>串行列以列默认值的顺序使用nextval()实现,并引用手册:

对于序列,此权限允许使用currvalnextval功能。

因此,如果有序列列,您还需要对序列授予使用权(或所有特权

GRANT USAGE ON ALL SEQUENCES IN SCHEMA foo TO mygrp;

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

您还将对用户或架构的默认权限感兴趣:

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

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

默认权限仅应用于目标用户创建的对象(用于角色my\u creating\u角色)。如果省略该子句,则默认为当前用户执行alterdefaultprivileges。明确地说:

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

匿名用户

我的答案与服务器故障的答案类似。通用域名格式。

如果您想比授予“所有特权”更保守,您可能想尝试类似的方法。

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

摘自博士后文献:

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

有关更多讨论,请参见问题“模式上的授权使用到底做了什么?”?。请特别注意博士后专家克雷格·林格的答案。

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