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

时间:2012-07-22 10:32:50

标签: postgresql grant dml

如何在PostgreSQL 8.4中的架构中的所有表上授予DML(SELECT,INSERT,UPDATE,DELETE)?我也希望将来能够继续创建新的表格。

我已经看过9.0的解决方案,但是因为它与Debian稳定版一起使用,我一直坚持使用8.4。

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

GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser;

我已经通过文档进行了疏导,我似乎无法找到合适的解决方案。

5 个答案:

答案 0 :(得分: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 ]

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

答案 1 :(得分:2)

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

授予ALL PRIVELEGES数据库授予CREATECONNECTTEMPORARY权利。

请参阅psql中的\h GRANTthe 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函数和各种第三方脚本可用pg_cataloginformation_schema动态构建GRANT并递归设置权限。搜索“postgresql recursive grant”。

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

如您所述,较新版本可通过GRANT ... ALL TABLES提供多种授权设施,但您的问题仅针对8.4。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

如果您有另一个具有DML权限的用户,则它适用于postgresql 8.x / 9.x:

grant <userWithDMLPrivileges> to testuser;

希望它有所帮助。

答案 4 :(得分:0)

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

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