24

您如何授予任意用户对所有功能和视图的读取/选择访问权限?

psql --user=postgres -d mydb -f myview.sql用来创建几个函数和视图,然后运行:

GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;

被授予所有权限后,我希望myuser现在可以访问postgres用户创建的功能和视图。但是,当我尝试使用 访问它们时myuser,我收到“关系被拒绝的权限...”错误。为什么是这样?

4

1 回答 1

33

原因是您需要额外的权限才能访问视图或表。数据库上的权限不包括对其中所有对象的访问。

它与功能不同:默认情况下EXECUTE授予特权public但是该函数是以当前用户的权限执行的。您可能对 . 的SECURITY DEFINER修饰符感兴趣CREATE FUNCTIONSELECT但通常在涉及的表上授权就足够了。

根据有关默认权限的文档:

根据对象的类型,初始默认权限可能包括授予PUBLIC. 默认情况下对表、列、模式和表空间没有公共访问权限;CONNECT 数据库的权限和TEMP建表权限;EXECUTE 功能特权;和USAGE语言的特权。

您可能对此 DDL 命令感兴趣(需要 Postgres 9.0或更高版本):

GRANT SELECT ON ALL TABLES IN SCHEMA public TO myuser;

当然,在连接到有问题的数据库时(请参阅下面的@marcel 评论),并且作为具有足够权限的用户。您可能还对设置感兴趣DEFAULT PRIVILEGES

更详细的回答如何管理权限:

pgAdmin具有用于更复杂的批量操作的功能:

在此处输入图像描述

或者您可以查询系统目录以创建用于批量授予/撤销的 DDL 语句...

于 2012-05-08T01:18:53.387 回答