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

poi*_*hat 10 postgresql grant dml

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

我已经看过9.0的解决方案,但我坚持使用8.4,因为它随Debian稳定运行.

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

GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser;
Run Code Online (Sandbox Code Playgroud)

我已经通过文档挖掘了,我似乎无法找到合适的解决方案.

A.H*_*.H. 21

我也希望这笔赠款能够在将来继续创建新的表格.[...]我已经通过文档挖掘了我似乎无法找到合适的解决方案.

因为在9.0之前没有.您只需设置现有表的权限即可.你必须GRANT为每个表做一个,因为在9.0之前没有"批量"模式.请参阅8.49.0的SQL语法:

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [,...] | ALL [ PRIVILEGES ] }
    ON [ TABLE ] tablename [, ...]
    TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]
Run Code Online (Sandbox Code Playgroud)

和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 ]
Run Code Online (Sandbox Code Playgroud)

ALL TABLES IN SCHEMA部分是您缺少的部分.

另外:在你问题中设置数据库级别的权限对你没有帮助:你将"只"设置数据库的权限,而不是任何"包含"的东西,如表.相关部分:

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
    ON DATABASE dbname [, ...]
    TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]
Run Code Online (Sandbox Code Playgroud)

这意味着你可以只设置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');
Run Code Online (Sandbox Code Playgroud)