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

Posted

技术标签:

【中文标题】PostgreSQL 8.4 将所有表的 DML 权限授予一个角色【英文标题】:PostgreSQL 8.4 grant DML privileges on all tables to a role 【发布时间】:2012-07-20 22:07:06 【问题描述】:

如何在 PostgreSQL 8.4 的模式中的所有表上授予 DML(SELECT、INSERT、UPDATE、DELETE)?我还希望这笔赠款能够在将来继续用于创建新表。

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

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

GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser;

我已经翻阅了文档,但似乎找不到合适的解决方案。

【问题讨论】:

为什么不能升级?肯定有办法升级 PostgreSQL。当前版本都可以从 Postgres 网站下载。 肯定有升级方法,但我不希望这样做,因为供应商提供的软件包已经很好地集成、测试和理解。我们的计划是在宣布 Debian wheezy 稳定的同时升级到 9.1。 我永远无法理解为什么有些操作系统会如此光顾用户。 我们确实有选择(Debian backports/switch to CentOS+vendor packages),但我们选择不接受它们,因为它们需要更多的维护。我们真的很懒:-) @pointyhat:Lazy 还不错,但是 PostgreSQL 9.1 在 Debian stable 发布后不久就可供懒人使用。有一个official backport。我们在多台服务器上使用它,就像一个魅力。升级到下一个 Debian 版本也可以顺利进行。从阅读instructions on backports.debian.org开始。 【参考方案1】:

我还希望这笔赠款在未来也能持续用于创建新表。 [...] 我已经翻阅了文档,但似乎找不到合适的解决方案。

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

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');

【讨论】:

感谢您的回答 - 这完美地解释了它! 不幸的是,它没有授予序列权限——而这些权限通常很有用。 刚刚发现还有ALL SEQUENCES IN SCHEMA schema_name这个很好用! 从这个答案和@Calimo 的评论推断,我posted a script here 负责表和序列授权: 感谢授权脚本:D【参考方案2】:

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

在数据库上授予ALL PRIVELEGES 授予CREATECONNECTTEMPORARY 权限。

查看 psql 中的\h GRANT 或the documentation for GRANT in 8.4,了解ALL PRIVILEGESDATABASE 的含义:

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

有 plpgsql 函数和各种 3rd 方脚本可用,它们使用 pg_cataloginformation_schema 动态构建 GRANTs 并递归设置权限。搜索“postgresql 递归授权”。

这些不会帮助您为 表设置默认访问权限。 PostgreSQL 确实有 ALTER DEFAULT PRIVILEGES 允许您为新表设置默认表权限,但它仅在 Pg 9.1 和更高版本中受支持。在旧版本中或在创建表后设置权限时,每个表都需要显式 GRANTs。

如您所述,较新的版本可以通过GRANT ... ALL TABLES 进行多次授权,但您的问题是针对 8.4 的。

【讨论】:

【参考方案3】:

我相信你做不到。但是您可以使用信息模式来生成授权,因此您不必为 10,000 个表手动执行此操作。请参阅下面的链接以获取相关示例,并且该站点链接到 easy very good for info。

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

【讨论】:

【参考方案4】:

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

grant <userWithDMLPrivileges> to testuser;

希望对你有帮助。

【讨论】:

【参考方案5】:

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

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

【讨论】:

以上是关于PostgreSQL 8.4 将所有表的 DML 权限授予一个角色的主要内容,如果未能解决你的问题,请参考以下文章

无法将 PostgreSQL 作为 Windows 服务运行

Postgresql 8.4 和 BitDefender 11

没有运算符与给定名称和参数类型匹配。您可能需要添加显式类型转换。 -- Netbeans、Postgresql 8.4 和 Glassfish

Django TemplateSyntaxError: current transaction is aborted,这个异常是啥意思? postgresql 8.4 可以与 django 一起正常工

PostgreSQL 统计同一张表的多列

授予对 PostgreSQL 中未来表的权限?