如何将视图的所有权限授予任意用户
Posted
技术标签:
【中文标题】如何将视图的所有权限授予任意用户【英文标题】:How to grant all privileges on views to arbitrary user 【发布时间】:2012-05-16 11:59:29 【问题描述】:如何将所有函数和视图的读取/选择权限授予任意用户?
我使用psql --user=postgres -d mydb -f myview.sql
创建了几个函数和视图,然后运行:
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
在被授予所有权限后,我希望myuser
现在可以访问postgres
用户创建的功能和视图。但是,当我尝试使用myuser
访问它们时,我收到“permission denied for relationship...”错误。这是为什么呢?
【问题讨论】:
【参考方案1】:原因是您需要额外的权限才能访问视图或表。数据库上的权限不包括对其中所有对象的访问。
函数不同:EXECUTE
权限默认授予public
。 但是该函数是以当前用户的权限执行的。您可能对CREATE FUNCTION
的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
的设置感兴趣:
更详细的回答如何管理权限:
How to manage DEFAULT PRIVILEGES for USERs on a DATABASE vs SCHEMA?pgAdmin 具有更复杂的批量操作功能:
或者您可以查询系统目录以创建用于批量授予/撤销的 DDL 语句...
【讨论】:
我花了一个小时才意识到 'GRANT SELECT ON SCHEMA public to myuser;'仅当授予该数据库的用户 CONNECTED 时执行此命令才有意义。如果没有,它只是不做任何事情(或者至少它不给用户选择权限)。在超级用户的 shell 中使用 \c databasename。 这不会授予用户对序列的权限。 @Cerin:这个问题要求views,你不需要序列的特权(至少在撰写本文时尚未实现可更新视图)。更多特权请见:***.com/questions/24918367/…以上是关于如何将视图的所有权限授予任意用户的主要内容,如果未能解决你的问题,请参考以下文章