我如何在 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 ]
这意味着您只能对数据库本身设置CREATE
、CONNECT
和TEMP
权限,而不能设置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/