如何尽可能容易地创build具有有限权限的PostgreSQL Web应用程序用户?

有人现在是一个简单而快速的方法来实现以下目标:

我有一个PostgreSQL 8.2.9 DBMS与几个(10左右)不同的数据库,这一切都服务于各自的Web应用程序。 这些数据库被分成不同的scheme,当然这些scheme被分成不同的表格。

我正在使用postgres超级用户连接到我的Web应用程序中的数据库。 现在我想重新思考我的安全概念,因此创build一个权限较低的用户,只能执行以下操作:对所有数据库的所有表执行INSERT,DELETE,UPDATE和SELECT。 这个用户是否可以访问所有的数据库并不重要,我不想为所有的Web应用程序创build单独的用户。

无论如何,应该有一些方法来创build它后给用户授予这些特权,就像

授予select,插入,更新,删除 TO new_user;

我只知道如何将这些权限授予单个表,但是这将是一个在10个数据库上分布的超过10000个表的奥德赛。 我已经阅读了一些关于读取pg_tables metatable来获取所有表的列表,但它不知道我的版本。 也许你也可以回答,如果实际上有一个PostgreSQL数据库站在所有数据库之上,并包含有关所有数据库的元信息! 我只注意到在每个数据库中都有一个名为information_schema的模式,它托pipe有关当前数据库的信息?

非常感谢你。

批量GRANT / REVOKE仅适用于PostgreSQL 9.0+。

相反,您可以创build在http://blog.bhushangahire.net/2009/06/17/grant-privileges-to-all-tables-in-a-database-for-中find的函数pg_grant()和pg_revoke() PostgreSQL的/

这两个函数的参数是:

  1. 用户angular色
  2. 权限
  3. 对象名称,可能是一个模式。 “%”影响所有对象
  4. 架构名称

您将需要在每个数据库和每个模式上运行该命令。 语法如下所示:

SELECT pg_grant('web_user','SELECT,INSERT,UPDATE,DELETE','%','public'); 

如果你喜欢,你可以在函数定义中改变这一行:

 nspname = $4 AND 

对此:

 nspname like $4 AND 

为了能够指定模式作为通配符,但我没有testing它。