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

标签 postgresql sql-grant dml

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

我看过 9.0 的解决方案,但我仍然坚持使用 8.4,因为它随 Debian 稳定版一起提供。

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

GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser;

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

最佳答案

I'd also like this grant to persist for new table creation in the future as well. [...] I've dredged through the documentation and I can't seem to find a suitable solution.

因为9.0之前是没有的。您所能获得的只是为现有 表设置权限。您必须为每个表执行一次 GRANT,因为在 9.0 之前没有“批量”模式。查看 8.4 的 SQL 语法和 9.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 权限,而不能设置SELECT , INSERT


到目前为止,不好的东西。您可以做以下事情:

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

  • 查询系统目录并创建适当的 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 8.4 将所有表的 DML 权限授予一个角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11599533/

相关文章:

mysql - 向其他用户授予执行功能权限

mysql - 如何授予用户权限以授予其他用户在mysql中的只读访问权限

sql-server - 如何在 SQL Server 触发器中复制插入、更新、删除的行

sql - 在 CASE 中运行复杂的 sql 查询

mysql - 真实项目,什么时候可以达到bigint maxvalue

mysql - 如何授予用户远程访问mysql服务器的权限?

c# - DynamoDB .NET - 从表中删除所有项目

sql - Postgres 约束

sql - 使用 CURRENT_TIMESTAMP 查询时间戳分区表的效率

sql - 在 PL\SQL block 中使用 EXECUTE IMMEDIATE