2012-05-08 71 views
18

如何授予对任意用户的所有函数和视图的读/选访问权限?如何将视图的所有权限授予任意用户

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

GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser; 

已经被授予的所有权限,我希望myuser到现在有机会获得由postgres用户创建的函数和视图。但是,当我尝试使用myuser访问它们时,我得到“拒绝关系...的权限”错误。为什么是这样?

回答

25

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

它与功能不同:EXECUTE默认授予public权限。 但是该功能是以当前用户的权限执行的。您可能对的SECURITY DEFINER修饰符感兴趣。但通常在相关表上授予SELECT就足够了。

Per documentation about default privileges:

根据对象的不同,初始的缺省权限可能 包括赋予一些权限来PUBLIC。表,列,模式和表空间的默认值是公开的 访问权限; CONNECT 特权和TEMP数据库的表创建权限; EXECUTE 功能特权;和USAGE语言的特权。

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

GRANT SELECT ON ALL TABLES IN SCHEMA public TO myuser; 

在连接到所讨论的数据库,当然(见下文@marcel's comment),并作为具有足够特权的用户。您还可能有兴趣在设置DEFAULT PRIVILEGES

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

pgAdmin有一个特点, F或更复杂的批量操作:

enter image description here

,也可以查询系统目录创建批量授予/撤销DDL语句...

+2

我花了一个小时才意识到'选择所有表格在SCHEMA中公开给myuser;'只有在授予用户* CONNECTED *到该数据库时执行此命令时才有意义。如果没有,它只是没有做任何事情(或者至少它没有给用户选择权限)。在超级用户的shell中使用\ c databasename。 – marcel

+0

@marcel:我加了一张纸条来提醒人们。 –

+0

这不会授予用户对序列的权限。 – Cerin