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

PostgreSQL 8.4将所有表上的DML权限授予角色,postgresql,grant,dml,Postgresql,Grant,Dml,如何在PostgreSQL 8.4中对模式中的所有表授予DML(选择、插入、更新、删除)?我也希望这项拨款能在将来用于新表的创建 我已经看到了9.0的解决方案,但我仍然坚持使用8.4,因为它附带了Debian stable 我尝试了以下作为基线,但不起作用,导致不可避免的“拒绝访问关系X”: 我浏览了文档,似乎找不到合适的解决方案 我也希望这项拨款能在将来用于新表的创建。 […]我仔细阅读了文档,似乎找不到合适的解决方案 因为9.0之前没有。您所能得到的只是设置现有表的权限。您必须为每个表执行一

如何在PostgreSQL 8.4中对模式中的所有表授予DML(选择、插入、更新、删除)?我也希望这项拨款能在将来用于新表的创建

我已经看到了9.0的解决方案,但我仍然坚持使用8.4,因为它附带了Debian stable

我尝试了以下作为基线,但不起作用,导致不可避免的“拒绝访问关系X”:

我浏览了文档,似乎找不到合适的解决方案

我也希望这项拨款能在将来用于新表的创建。 […]我仔细阅读了文档,似乎找不到合适的解决方案

因为9.0之前没有。您所能得到的只是设置现有表的权限。您必须为每个表执行一个
GRANT
,因为在9.0之前没有“批量”模式。有关和,请参见SQL语法:

这里是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 ]
架构中新的
所有表
部分就是您缺少的部分

另外:在数据库级别上设置权限(如您的问题所述)对您没有帮助:您将“仅”在数据库上设置权限,而不会在任何“包含”的东西(如表)上设置权限。有关章节:

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
    ON DATABASE dbname [, ...]
    TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]
这意味着您只能对数据库本身设置
CREATE
CONNECT
TEMP
权限,但不能
选择
插入


到目前为止都是坏消息。您可以做以下几件事:

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

  • 查询系统目录并创建相应的
    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');

PostgreSQL中的授权不是递归的;对数据库的
GRANT
设置对数据库对象的权限,但不影响包含的架构或其表、视图、函数等

在数据库上授予
所有权限
将授予
创建
连接
临时
权限

请参阅psql中的
\h GRANT
,或查看
数据库的
所有特权的含义:

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
    ON DATABASE database_name [, ...]
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
有可用的plpgsql函数和各种第三方脚本,它们使用
pg_catalog
information_schema
动态构建
GRANT
s并递归设置权限。搜索“postgresql递归授权”

这些将不会帮助您设置新表的默认访问权限。PostgreSQL doe必须允许您为新表设置默认表权限,但它仅在第9.1页及更新版本中受支持。旧版本中的每个表都需要显式
GRANT
s,或者在创建表后要设置权限时需要显式
s


正如您所注意到的,较新的版本具有通过多次补助的功能,但您的问题是针对8.4的。

我相信您无法做到这一点。但是您可以使用信息模式来生成授权,这样就不必为10000个表手动执行授权。请参阅下面的链接,了解相关示例,以及链接到easy的网站,以获取非常好的信息


在所有表格上添加所有权限:

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

如果您有另一个拥有DML权限的用户,则它可以在postgresql 8.x/9.x中工作:

grant <userWithDMLPrivileges> to testuser;
授予testuser;

希望有帮助。

为什么不能升级?肯定有办法升级PostgreSQL。目前的版本都可以从Postgres网站上下载。当然有升级的方法,但我不希望这样做,因为供应商提供的软件包已经很好地集成、测试和理解了。我们的计划是在Debian wheezy被宣布稳定的同时将其升级到9.1。我永远不会理解为什么一些操作系统会如此光顾用户。我们确实有选择(Debian Backport/切换到CentOS+供应商软件包),但我们选择不使用它们,因为它们需要更多的维护。我们真的很懒:-)@pointyhat:lazy还可以,但是PostgreSQL 9.1在Debian stable发布后不久就可以为懒惰的人提供了。有一个问题。我们在多台服务器上使用它,效果非常好。升级到下一个Debian版本也不会有什么效果。从阅读开始。谢谢你的回答-这很好地解释了它!不幸的是,它没有授予序列权限,而这些权限通常是有用的。我们刚刚发现,SCHEMA\u name
中也有非常有用的
所有序列!从这个答案和@Calimo的评论推断,我负责表和序列授权:thakns for grant script:D
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO [username];
grant <userWithDMLPrivileges> to testuser;