PostgreSQL 8.4将所有表的DML权限授予角色

问题描述:

如何在PostgreSQL 8.4的模式中的所有表上授予DML(SELECT,INSERT,UPDATE,DELETE)?我也希望这笔赠款能够在未来继续创造新的表格。PostgreSQL 8.4将所有表的DML权限授予角色

我已经看到了9.0的解决方案,但是我坚持使用8.4,因为它随Debian稳定版一起提供。

我曾尝试以下作为基准,但它不能正常工作,导致不可避免的“访问关系X被拒绝”:

GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser; 

我已经通过文件疏浚,我不能似乎找到了合适的解决方案。

+0

为什么不能升级?肯定有办法升级PostgreSQL。目前的版本都可以从Postgres网站下载。 – 2012-07-22 14:08:23

+0

确实有升级的方法,但我不希望供应商提供的软件包能很好地集成,测试和理解。我们的计划是在9.1的同时,Debian wheezy被宣布为稳定。 – pointyhat 2012-07-22 14:35:03

+0

我永远不会明白为什么有些操作系统会光顾用户。 – 2012-07-22 14:37:30

我也希望这个补助金能够在未来继续创建新的表格。 [...]我已经通过文档挖掘,我似乎无法找到合适的解决方案。

因为在9.0之前没有。所有你可以得到的是设置现有的表的权限。您必须为每个表执行一个GRANT,因为在9.0之前没有“批量”模式。请参阅SQL语法的8.49.0

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } 
    [,...] | ALL [ PRIVILEGES ] } 
    ON [ TABLE ] tablename [, ...] 
    TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ] 

和9.0的位置:

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } 
    [,...] | ALL [ PRIVILEGES ] } 
    ON { [ TABLE ] table_name [, ...] 
     | ALL TABLES IN SCHEMA schema_name [, ...] } 
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] 

ALL TABLES IN SCHEMA部分是你缺少一个。

另外:在数据库级别设置权限与您的问题一样,不会对您有所帮助:您将“仅”设置数据库的权限,但不设置表中的任何“包含”内容。相关部分:

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } 
    ON DATABASE dbname [, ...] 
    TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ] 

这意味着你只能设置数据库本身CREATECONNECTTEMP权限,但没有SELECTINSERT


到目前为止,对于坏的东西。你可以做有以下几点:

  • 通过授予用户无法而是角色的权限降低权限管理的数量。然后将角色添加到单个用户。创建新表时,您只需调整一个或两个角色,但不需要调整数百个用户。

  • 查询系统目录并创建适当的GRANT命令。将它们保存到一个文件中并执行该文件。这应该会让你更容易启动。

这样的查询可能是这样的:

select 'GRANT ALL ON ' || table_schema || '.' || table_name ||' to my_group;' 
from information_schema.tables 
where 
    table_type = 'BASE TABLE' and 
    table_schema not in ('pg_catalog', 'information_schema'); 
+0

感谢您的回答 - 完美解释! – pointyhat 2012-07-22 14:39:26

+0

比我的回答更清晰,更完整,谢谢。 – 2012-07-22 23:24:26

+0

不幸的是,它不会授予序列的权限 - 而这些通常是有用的权限。 – Calimo 2013-06-19 08:12:08

补助的PostgreSQL是不是递归的;在数据库上GRANT设置权限的数据库对象,但不影响所包含的模式或他们的表,视图,函数等

授予对数据库补助CREATECONNECTTEMPORARY权利ALL PRIVELEGES

见PSQL \h GRANT,或the documentation for GRANT in 8.4,看到什么ALL PRIVILEGES手段DATABASE

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } 
    ON DATABASE database_name [, ...] 
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] 

有可用的使用pg_cataloginformation_schema动态建立GRANT S和递归设置PLPGSQL功能和多种第三方脚本权利。搜索“postgresql递归授权”。

这些将不会帮助您为新的表设置默认访问权限。 PostgreSQL doe有ALTER DEFAULT PRIVILEGES,允许您为新表设置默认表权限,但仅在Pg 9.1和更高版本中支持。显式GRANT s对于旧版本中的每个表或在创建表后设置权限时都是必需的。

正如您所指出的,较新的版本可通过GRANT ... ALL TABLES获得多项拨款,但您的问题仅限于8.4。

我相信你不能那样做。但是,您可以使用信息架构来生成授权,因此您无需手动为10,000个表执行此操作。请参阅下面的链接以获取相关示例,并将该网站链接到易于理解的信息。

http://www.postgresonline.com/journal/archives/30-DML-to-generate-DDL-and-DCL-Making-structural-and-Permission-changes-to-multiple-tables.html

添加所有权限的所有表:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO [username]; 
+2

将不适用于Postgres 2014-05-26 07:03:58

如果谁拥有DML权限的另一用户,它工作在PostgreSQL的网络版8.x/9.x中:

grant <userWithDMLPrivileges> to testuser; 

希望它有帮助。