Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将数据库中特定架构上的所有内容授予PostgreSQL中的组角色_Postgresql_Database Design_Roles_Privileges_Grant - Fatal编程技术网

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

将数据库中特定架构上的所有内容授予PostgreSQL中的组角色,postgresql,database-design,roles,privileges,grant,Postgresql,Database Design,Roles,Privileges,Grant,使用PostgreSQL 9.0,我有一个名为“staff”的组角色,并希望在特定模式的表上为该角色授予所有(或某些)权限。下面的工作都没有 GRANT ALL ON SCHEMA foo TO staff; GRANT ALL ON DATABASE mydb TO staff; “staff”的成员仍然无法选择或更新架构“foo”中的各个表,或者(在第二个命令的情况下)数据库中的任何表,除非我对该特定表授予全部权限 我能做些什么让我和我的用户的生活更轻松 更新:在的帮助下解决了这个问题 您

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

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

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

更新:在的帮助下解决了这个问题


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

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

我的
serial
列在序列上使用
nextval()

对于序列,此权限允许使用
currval
nextval
功能

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

GRANT USAGE ON ALL SEQUENCES IN SCHEMA foo TO mygrp;
注意:在Postgres 10或更高版本中,使用不需要额外特权的隐式序列。(考虑升级
serial
列。)

新的东西呢? 您还将对以下内容感兴趣:

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

默认权限仅应用于目标用户创建的对象(
用于角色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都有一个微妙的bug,并在SQL窗格中显示默认权限,即使它们不适用于当前角色。复制SQL脚本时,请确保手动调整
FOR ROLE
子句。

我的答案类似于

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

将模式中所有表上的SELECT、INSERT、UPDATE、DELETE授予某些用户;
将架构公共中的所有函数上的EXECUTE授予某个用户;
public
there的使用是指为每个新数据库/目录创建的默认模式的名称。如果创建了架构,请替换为您自己的名称

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

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

GRANT USAGE ON SCHEMA some_schema_ TO some_user_ ;
摘自:

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

有关更多讨论,请参见问题。请特别注意博士后专家的建议

现有目标与未来
这些命令仅影响现有对象。在重新执行上述行之前,您将来创建的表和其他表都将获得默认权限。请参阅以更改默认值,从而影响将来的对象。

您知道,欧文,在您发布建议10分钟后,我需要它。好像你知道我要做什么。。。创建一个新表,发现它没有正确的priv。你的回答终于有了答案。@punkish:我要我的precog徽章!运行模式foo中的
alterdefaultprivileges时,将表上的所有权限授予staff它如何知道哪个数据库
SCHEMA foo
可以存在于不同的数据库中?@J86:仅适用于执行命令的当前数据库。@ErwinBrandstetter如果表将由另一个专用迁移用户自动创建,我是否可以授予应用程序用户对未来表/序列的访问权限(读写)(flyway迁移在应用程序启动时运行)?除了上面的两项授权外,还需要一项授权:向某个用户授予架构公共使用权;@NingLiu非常感谢您指出授权使用权,并教我这一点。我在答案中添加了一个部分。架构上的授权使用权是我一直在寻找的。
ALTER DEFAULT PRIVILEGES FOR ROLE my_creating_role IN SCHEMA foo GRANT ...;
ALTER DEFAULT PRIVILEGES FOR ROLE my_creating_role IN SCHEMA foo REVOKE ...;
GRANT USAGE ON SCHEMA some_schema_ TO some_user_ ;