使用PostgreSQL 9.0,我有所谓的“工作人员”的一组角色,并希望给予所有(或某些)的权限这个角色上表中的特定模式。 以下工作的无
GRANT ALL ON SCHEMA foo TO staff;
GRANT ALL ON DATABASE mydb TO staff;
的“工作人员”的成员仍然无法选择或更新架构中的“富”或(在第二个命令的情况下)各个表,以数据库中的任何表,除非我授予所有对特定表。
我能做些什么让我和我的用户的生活更轻松?
更新:想通了的帮助下上serverfault.com类似的问题 。
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA foo TO staff;
你找到了速记设置权限在给定模式中的所有现有表。 该手册澄清 :
(但请注意, ALL TABLES
被认为包括意见和外国表 )。
大胆重点煤矿。 serial
列与实施nextval()
上的序列作为列默认和, 引述手册 :
比如,这个权限允许使用的currval
和nextval
功能。
因此,如果有serial
的列,你还需要授予USAGE
(或ALL PRIVILEGES
的序列 )
GRANT USAGE ON ALL SEQUENCES IN SCHEMA foo TO mygrp;
注: 标识列在Postgres的10或更高版本使用,不需要额外的特权隐含序列。 (考虑升级serial
列。)
什么新的对象?
你也有兴趣在DEFAULT PRIVILEGES
的用户或模式 :
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 ...;
还要注意的pgAdmin III的所有版本的SQL窗格中有个微妙的问题,并显示默认的权限,即使他们并不适用于当前的角色。 一定要调整FOR ROLE
复制SQL脚本时手动条款。
我的答案是类似这一项上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
那里指的是为每一个新的数据库/目录下创建的默认架构的名称。 如果你创建的模式有自己的名称替换。
访问模式
在所有访问模式,对于任何操作,用户必须被授予“使用”的权利。 之前用户可以选择,插入,更新或删除,用户必须首先被授予“使用”的模式。
首先使用Postgres的时候,你不会注意到这个要求。 默认情况下,每个数据库都有一个名为第一个架构public
。 ,默认为每用户已自动被授予“使用”权到特定的模式。 当添加额外的模式,那么你必须明确授予的使用权。
GRANT USAGE ON SCHEMA some_schema_ TO some_user_ ;
从摘录的Postgres文档 :
对于模式,允许访问包含在指定模式(假设该对象的所有权要求也达到了)对象。 本质上,这使得架构中被授予者“仰望”的对象。 如果没有此权限,仍然可以看到该对象的名称,例如,通过查询系统表。 此外,撤销该权限之后,现有的后端可能有以前执行该语句查找,所以这不是阻止对象访问一个完全安全的方式。
欲了解更多的讨论,参见问题, 究竟什么GRANT USAGE ON SCHEMA? 。 要特别注意的答案被Postgres的专家克雷格·林格 。
对战未来现有对象
这些命令只会影响现有对象。 您在未来创建表和这样获得缺省权限,直到你重新执行上面的那些行。 见对方的回答由欧文Brandstetter修改更改默认值,从而影响未来的对象。