【问题标题】: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...”错误。这是为什么呢?

【问题讨论】:

    标签: sql database postgresql grant pgadmin


    【解决方案1】:

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

    函数不同:EXECUTE 权限默认授予public但是该函数是以当前用户的权限执行的。您可能对CREATE FUNCTIONSECURITY 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 具有更复杂的批量操作功能:

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

    【讨论】:

    • 我花了一个小时才意识到 'GRANT SELECT ON SCHEMA public to myuser;'仅当授予该数据库的用户 CONNECTED 时执行此命令才有意义。如果没有,它只是不做任何事情(或者至少它不给用户选择权限)。在超级用户的 shell 中使用 \c databasename。
    • 这不会授予用户对序列的权限。
    • @Cerin:这个问题要求views,你不需要序列的特权(至少在撰写本文时尚未实现可更新视图)。更多特权请见:stackoverflow.com/questions/24918367/…
    猜你喜欢
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 2010-10-20
    相关资源
    最近更新 更多