10

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

我已经看到了 9.0 的解决方案,但我坚持使用 8.4,因为它与 Debian stable 一起提供。

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

GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser;

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

4

5 回答 5

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 ]

这意味着您只能设置CREATE,CONNECTTEMP数据库本身的权限,但不能设置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');
于 2012-07-22T14:08:12.740 回答
2

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

授予ALL PRIVELEGES数据库 grants和CREATE权限。CONNECTTEMPORARY

请参阅\h GRANTpsql 或8.4中的文档GRANT,以了解以下内容ALL PRIVILEGES的含义DATABASE

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
    ON DATABASE database_name [, ...]
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

有可用的 plpgsql 函数和各种 3rd 方脚本,可pg_catalog用于information_schema动态构建GRANT和递归设置权限。搜索“postgresql 递归授权”。

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

正如您所指出的,较新的版本具有通过 进行多次授权的功能GRANT ... ALL TABLES,但是您的问题特定于 8.4。

于 2012-07-22T14:08:27.727 回答
1

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

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

于 2012-07-22T14:09:26.887 回答
1

如果您有另一个拥有 DML 权限的用户,它可以在 postgresql 8.x/9.x 中使用:

grant <userWithDMLPrivileges> to testuser;

希望能帮助到你。

于 2015-07-30T08:02:29.373 回答
0

在所有表上添加所有特权:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO [username];
于 2014-03-14T22:36:50.810 回答