如何将视图的所有权限授予任意用户

Cer*_*rin 23 sql database postgresql grant pgadmin

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

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

GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
Run Code Online (Sandbox Code Playgroud)

获得所有权限后,我希望myuser现在可以访问postgres用户创建的功能和视图.但是,当我尝试访问它们时myuser,我得到了"关系允许拒绝..."错误.为什么是这样?

Erw*_*ter 30

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

它与函数不同:默认EXECUTE授予特权public.该功能是使用当前用户的权限执行的.您可能对SECURITY DEFINER修饰符感兴趣CREATE FUNCTION.但通常它足以授予SELECT涉及的表格.

有关默认权限的文档:

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

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

GRANT SELECT ON ALL TABLES IN SCHEMA public TO myuser;
Run Code Online (Sandbox Code Playgroud)

当然,连接到有问题的数据库(参见下面的@marcel的评论),以及具有足够权限的用户.您可能还对以下设置感兴趣DEFAULT PRIVILEGES:

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

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

在此输入图像描述

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

  • 花了我一个小时的时间才意识到"在SCHEMA公共场所给所有表格的选择权给了我的用户;" 仅当授予的用户是*CONNECTED*到该数据库时执行此命令才有意义.如果没有,它只是没有做任何事情(或者至少它没有给用户提供选择权限).在超级用户的shell中使用\ c databasename. (4认同)