在使用PostgreSQL 9.0时,我有一个名为"staff“的组角色,并希望对特定模式中的表授予此角色的所有(或某些)特权。以下工作均未完成
GRANT ALL ON SCHEMA foo TO staff;
GRANT ALL ON DATABASE mydb TO staff;
"staff“的成员仍然不能选择或更新模式"foo”中的单个表,或者(在第二个命令的情况下)更新到数据库中的任何表,除非我授予该特定表所有权限。
我能做些什么让我和我的用户的生活变得更轻松?
更新:在a similar question on serverfault.com的帮助下解决了这个问题。
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA foo TO staff;
发布于 2012-04-27 23:46:19
您找到了为给定模式中的所有现有表设置权限的简写方法。The manual clarifies
(但请注意,
ALL TABLES
被认为包括视图和外部表)。
大胆强调我的观点。serial
列在作为列缺省值的序列上使用nextval()
和,quoting the manual实现
对于序列,此权限允许使用
currval
和nextval
函数。
因此,如果有serial
列,您还需要对sequences授予serial
(或ALL PRIVILEGES
) 权限
GRANT USAGE ON ALL SEQUENCES IN SCHEMA foo TO mygrp;
注意:Postgres10或更高版本中的identity columns使用不需要额外特权的隐式序列。(请考虑升级serial
列。)
那么新的对象呢?
您还会对 for users or schemas感兴趣
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
的当前用户。明确地说:
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子句。
发布于 2014-07-06 14:29:46
我的答案类似于this one on 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_;
这里使用的public
指的是为每个新数据库/目录创建的默认模式的名称。如果您创建了架构,请替换为您自己的名称。
对架构的访问
对于任何操作,要访问模式,用户必须被授予"usage“权限。在用户可以选择、插入、更新或删除之前,必须首先向用户授予对模式的“使用”权限。
第一次使用Postgres时,您不会注意到这一要求。默认情况下,每个数据库都有一个名为public
的第一个模式。默认情况下,每个用户都被自动授予对该特定模式的“使用”权限。添加其他架构时,必须显式授予使用权限。
GRANT USAGE ON SCHEMA some_schema_ TO some_user_ ;
模式的
允许访问指定模式中包含的对象(假设还满足对象自身的权限要求)。本质上,这允许被授权者在模式中“查找”对象。在没有此权限的情况下,仍然可以查看对象名称,例如通过查询系统表。此外,在撤销此权限后,现有后端可能具有以前执行过此查找的语句,因此这不是阻止对象访问的完全安全的方法。
有关更多讨论,请参阅问题What GRANT USAGE ON SCHEMA exactly do?。请特别注意Postgres专家Craig Ringer的the Answer。
现有对象与未来
这些命令仅影响现有对象。在重新执行上述行之前,您将来创建的表和类似的表将获得默认权限。请参阅other answer by Erwin Brandstetter以更改默认值,从而影响将来的对象。
https://stackoverflow.com/questions/10352695
复制相似问题