首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将数据库中特定架构的all权限授予PostgreSQL中的组角色

将数据库中特定架构的all权限授予PostgreSQL中的组角色
EN

Stack Overflow用户
提问于 2012-04-27 22:39:04
回答 2查看 169.8K关注 0票数 110

在使用PostgreSQL 9.0时,我有一个名为"staff“的组角色,并希望对特定模式中的表授予此角色的所有(或某些)特权。以下工作均未完成

代码语言:javascript
复制
GRANT ALL ON SCHEMA foo TO staff;
GRANT ALL ON DATABASE mydb TO staff;

"staff“的成员仍然不能选择或更新模式"foo”中的单个表,或者(在第二个命令的情况下)更新到数据库中的任何表,除非我授予该特定表所有权限。

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

更新:a similar question on serverfault.com的帮助下解决了这个问题。

代码语言:javascript
复制
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA foo TO staff;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-27 23:46:19

您找到了为给定模式中的所有现有表设置权限的简写方法。The manual clarifies

(但请注意,ALL TABLES被认为包括视图外部表)。

大胆强调我的观点。serial列在作为列缺省值的序列上使用nextval()和,quoting the manual实现

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

因此,如果有serial列,您还需要对sequences授予serial(或ALL PRIVILEGES) 权限

代码语言:javascript
复制
GRANT USAGE ON ALL SEQUENCES IN SCHEMA foo TO mygrp;

注意:Postgres10或更高版本中的identity columns使用不需要额外特权的隐式序列。(请考虑升级serial列。)

那么新的对象呢?

您还会对 for users or schemas感兴趣

代码语言:javascript
复制
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的当前用户。明确地说:

代码语言:javascript
复制
ALTER DEFAULT PRIVILEGES FOR ROLE my_creating_role IN SCHEMA foo GRANT ...;
ALTER DEFAULT PRIVILEGES FOR ROLE my_creating_role IN SCHEMA foo REVOKE ...;

还要注意,SQL的所有版本都有一个细微的错误,并在pgAdmin窗格中显示默认权限,即使它们不适用于当前角色。在复制FOR ROLE脚本时,请确保手动调整SQL子句。

票数 140
EN

Stack Overflow用户

发布于 2014-07-06 14:29:46

我的答案类似于this one on ServerFault.com

成为保守派

如果你想比授予“所有特权”更保守,你可能想尝试更多类似的东西。

代码语言:javascript
复制
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_;

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

对架构的访问

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

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

代码语言:javascript
复制
GRANT USAGE ON SCHEMA some_schema_ TO some_user_ ;

摘自Postgres doc

模式的

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

有关更多讨论,请参阅问题What GRANT USAGE ON SCHEMA exactly do?。请特别注意Postgres专家Craig Ringerthe Answer

现有对象与未来

这些命令仅影响现有对象。在重新执行上述行之前,您将来创建的表和类似的表将获得默认权限。请参阅other answer by Erwin Brandstetter以更改默认值,从而影响将来的对象。

票数 49
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10352695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档