将数据库中特定架构上的所有内容授予PostgreSQL中的组角色
使用PostgreSQL 9.0,我有一个名为“staff”的组角色,并希望在特定模式的表上为该角色授予所有(或某些)权限。下面的工作都没有将数据库中特定架构上的所有内容授予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”中的各个表,或者(在第二个命令的情况下)数据库中的任何表,除非我对该特定表授予全部权限 我能做些什么让我和我的用户的生活更轻松 更新:在的帮助下解决了这个问题 您
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_ ;