PostgreSQL 8.4将所有表上的DML权限授予角色
如何在PostgreSQL 8.4中对模式中的所有表授予DML(选择、插入、更新、删除)?我也希望这项拨款能在将来用于新表的创建 我已经看到了9.0的解决方案,但我仍然坚持使用8.4,因为它附带了Debian stable 我尝试了以下作为基线,但不起作用,导致不可避免的“拒绝访问关系X”: 我浏览了文档,似乎找不到合适的解决方案 我也希望这项拨款能在将来用于新表的创建。 […]我仔细阅读了文档,似乎找不到合适的解决方案 因为9.0之前没有。您所能得到的只是设置现有表的权限。您必须为每个表执行一个PostgreSQL 8.4将所有表上的DML权限授予角色,postgresql,grant,dml,Postgresql,Grant,Dml,如何在PostgreSQL 8.4中对模式中的所有表授予DML(选择、插入、更新、删除)?我也希望这项拨款能在将来用于新表的创建 我已经看到了9.0的解决方案,但我仍然坚持使用8.4,因为它附带了Debian stable 我尝试了以下作为基线,但不起作用,导致不可避免的“拒绝访问关系X”: 我浏览了文档,似乎找不到合适的解决方案 我也希望这项拨款能在将来用于新表的创建。 […]我仔细阅读了文档,似乎找不到合适的解决方案 因为9.0之前没有。您所能得到的只是设置现有表的权限。您必须为每个表执行一
GRANT
,因为在9.0之前没有“批量”模式。有关和,请参见SQL语法:
这里是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 ]
架构中新的所有表
部分就是您缺少的部分
另外:在数据库级别上设置权限(如您的问题所述)对您没有帮助:您将“仅”在数据库上设置权限,而不会在任何“包含”的东西(如表)上设置权限。有关章节:
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
ON DATABASE dbname [, ...]
TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]
这意味着您只能对数据库本身设置CREATE
、CONNECT
和TEMP
权限,但不能选择
、插入
等
到目前为止都是坏消息。您可以做以下几件事:
- 通过不向用户而是向角色授予权限,减少权限管理的数量。然后向单个用户添加角色。创建新表时,您只需要调整一个或两个角色,而不需要调整数百个用户
- 查询系统目录并创建相应的
命令。将它们保存到文件中并执行该文件。这会让你更容易启动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');
PostgreSQL中的授权不是递归的;对数据库的
GRANT
设置对数据库对象的权限,但不影响包含的架构或其表、视图、函数等
在数据库上授予所有权限
将授予创建
、连接
和临时
权限
请参阅psql中的\h GRANT
,或查看数据库的所有特权的含义:
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
ON DATABASE database_name [, ...]
TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
有可用的plpgsql函数和各种第三方脚本,它们使用pg_catalog
或information_schema
动态构建GRANT
s并递归设置权限。搜索“postgresql递归授权”
这些将不会帮助您设置新表的默认访问权限。PostgreSQL doe必须允许您为新表设置默认表权限,但它仅在第9.1页及更新版本中受支持。旧版本中的每个表都需要显式GRANT
s,或者在创建表后要设置权限时需要显式s
正如您所注意到的,较新的版本具有通过多次补助的功能,但您的问题是针对8.4的。我相信您无法做到这一点。但是您可以使用信息模式来生成授权,这样就不必为10000个表手动执行授权。请参阅下面的链接,了解相关示例,以及链接到easy的网站,以获取非常好的信息
在所有表格上添加所有权限:
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO [username];
如果您有另一个拥有DML权限的用户,则它可以在postgresql 8.x/9.x中工作:
grant <userWithDMLPrivileges> to testuser;
授予testuser;
希望有帮助。为什么不能升级?肯定有办法升级PostgreSQL。目前的版本都可以从Postgres网站上下载。当然有升级的方法,但我不希望这样做,因为供应商提供的软件包已经很好地集成、测试和理解了。我们的计划是在Debian wheezy被宣布稳定的同时将其升级到9.1。我永远不会理解为什么一些操作系统会如此光顾用户。我们确实有选择(Debian Backport/切换到CentOS+供应商软件包),但我们选择不使用它们,因为它们需要更多的维护。我们真的很懒:-)@pointyhat:lazy还可以,但是PostgreSQL 9.1在Debian stable发布后不久就可以为懒惰的人提供了。有一个问题。我们在多台服务器上使用它,效果非常好。升级到下一个Debian版本也不会有什么效果。从阅读开始。谢谢你的回答-这很好地解释了它!不幸的是,它没有授予序列权限,而这些权限通常是有用的。我们刚刚发现,SCHEMA\u name
中也有非常有用的所有序列!从这个答案和@Calimo的评论推断,我负责表和序列授权:thakns for grant script:D
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO [username];
grant <userWithDMLPrivileges> to testuser;