PostgreSQL 8.4将所有表的DML权限授予角色
如何在PostgreSQL 8.4的模式中的所有表上授予DML(SELECT,INSERT,UPDATE,DELETE)?我也希望这笔赠款能够在未来继续创造新的表格。PostgreSQL 8.4将所有表的DML权限授予角色
我已经看到了9.0的解决方案,但是我坚持使用8.4,因为它随Debian稳定版一起提供。
我曾尝试以下作为基准,但它不能正常工作,导致不可避免的“访问关系X被拒绝”:
GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser;
我已经通过文件疏浚,我不能似乎找到了合适的解决方案。
我也希望这个补助金能够在未来继续创建新的表格。 [...]我已经通过文档挖掘,我似乎无法找到合适的解决方案。
因为在9.0之前没有。所有你可以得到的是设置现有的表的权限。您必须为每个表执行一个GRANT
,因为在9.0之前没有“批量”模式。请参阅SQL语法的8.4和9.0:
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
,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');
补助的PostgreSQL是不是递归的;在数据库上GRANT
设置权限的数据库对象,但不影响所包含的模式或他们的表,视图,函数等
授予对数据库补助CREATE
,CONNECT
和TEMPORARY
权利ALL PRIVELEGES
。
见PSQL \h GRANT
,或the documentation for GRANT
in 8.4,看到什么ALL PRIVILEGES
手段DATABASE
:
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
ON DATABASE database_name [, ...]
TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
有可用的使用pg_catalog
或information_schema
动态建立GRANT
S和递归设置PLPGSQL功能和多种第三方脚本权利。搜索“postgresql递归授权”。
这些将不会帮助您为新的表设置默认访问权限。 PostgreSQL doe有ALTER DEFAULT PRIVILEGES,允许您为新表设置默认表权限,但仅在Pg 9.1和更高版本中支持。显式GRANT
s对于旧版本中的每个表或在创建表后设置权限时都是必需的。
正如您所指出的,较新的版本可通过GRANT ... ALL TABLES
获得多项拨款,但您的问题仅限于8.4。
我相信你不能那样做。但是,您可以使用信息架构来生成授权,因此您无需手动为10,000个表执行此操作。请参阅下面的链接以获取相关示例,并将该网站链接到易于理解的信息。
添加所有权限的所有表:
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO [username];
将不适用于Postgres 2014-05-26 07:03:58
如果谁拥有DML权限的另一用户,它工作在PostgreSQL的网络版8.x/9.x中:
grant <userWithDMLPrivileges> to testuser;
希望它有帮助。
为什么不能升级?肯定有办法升级PostgreSQL。目前的版本都可以从Postgres网站下载。 – 2012-07-22 14:08:23
确实有升级的方法,但我不希望供应商提供的软件包能很好地集成,测试和理解。我们的计划是在9.1的同时,Debian wheezy被宣布为稳定。 – pointyhat 2012-07-22 14:35:03
我永远不会明白为什么有些操作系统会光顾用户。 – 2012-07-22 14:37:30