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



如何在PostgreSQL 8.4中对架构中的所有表授予DML(SELECT、INSERT、UPDATE、DELETE)?我也希望这笔拨款能在未来的新表创建中持续使用。

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

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

GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser;

我查阅了文件,似乎找不到合适的解决方案。

我也希望这笔拨款能在未来的新表创建中继续使用。[…]我查阅了文件,似乎找不到合适的解决方案。

因为在9.0之前没有。您所能得到的只是为现有表设置权限。您必须为每个表执行一个GRANT,因为在9.0之前没有"批量"模式。参见8.4和9.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');

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

在数据库上授予ALL PRIVELEGES授予CREATECONNECTTEMPORARY权限。

请参阅psql中的h GRANT,或8.4中GRANT的文档,了解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递归授予"。

这些不会帮助您为表设置默认访问权限。PostgreSQL确实有ALTERDEFAULTPRIVILEGES,允许您为新表设置默认的表权限,但它只在Pg9.1及更新版本中受支持。在旧版本中,或者在创建表后设置权限时,每个表都需要显式GRANT

正如您所指出的,较新版本通过GRANT ... ALL TABLES提供了多次拨款的便利,但您的问题针对8.4。

我相信你做不到。但是您可以使用信息模式来生成授权,这样您就不必为10000个表手动执行此操作。请参阅下面的链接以获取相关示例和链接到easy-verygood的网站信息。

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

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

grant <userWithDMLPrivileges> to testuser;

希望能有所帮助。

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

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

相关内容

  • 没有找到相关文章

最新更新