如何在PostgreSQL 8.4中的模式中的所有表上授予DML(SELECT,INSERT,UPDATE,DELETE)?我也希望这笔赠款能够在将来继续创建新的表格.
我已经看过9.0的解决方案,但我坚持使用8.4,因为它随Debian稳定运行.
我已经尝试了以下作为基线,但它不起作用,导致不可避免的"访问关系X被拒绝":
GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser;
我已经通过文档挖掘了,我似乎无法找到合适的解决方案.
我也希望这笔赠款能够在将来继续创建新的表格.[...]我已经通过文档挖掘了我似乎无法找到合适的解决方案.
因为在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 ]
这意味着你可以只设置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');