【问题标题】:Is there a way to inherits table which is not owned by current user有没有办法继承当前用户不拥有的表
【发布时间】:2019-03-14 16:56:57
【问题描述】:

我在我的 PostgreSQL 数据库中创建了两个用户。比如说migrationdev

我用用户migration 创建了一个表A。然后我创建表B 继承表A 作为用户dev,但是失败了。

ERROR:  must be owner of relation A

如果我不想更改表所有者,有没有其他方法可以让它工作?

【问题讨论】:

    标签: postgresql database-permissions


    【解决方案1】:

    一种方法是使用两个用户都是其成员的角色:

    CREATE ROLE tab_owner NOLOGIN NOINHERIT;
    
    GRANT tab_owner TO dev, migration;
    

    现在当migration 创建一个表时,它首先运行:

    SET ROLE tab_owner;
    

    那么表就归角色所有了。

    用户dev 在创建表的继承子表之前执行相同的操作。

    【讨论】:

    • 感谢@Laurenz Albe,实际上我在我的问题中简化了用例,真实情况是:我想通过继承使用分区表。所以我为插入操作创建并自动触发,当插入数据行时,它会按创建时间自动创建子表,由于上述原因它失败了,这就是我创建这个问题的原因。在我做了一些调查之后,我使用 SECURITY DEFINER 解决了它。
    • 使用表所有者拥有的触发器函数并将其定义为SECURITY DEFINER。不要忘记函数声明中的SET search_path = pg_catalog
    • 其实我对这个search_path很困惑,我看到文档提到了这个,我不太确定它曾经是什么,目前我是这样设置的:SET search_path = public, pg_temp;有什么问题在这里?
    • 抱歉太简洁了,我指的是this 文档中关于SECURITY DEFINER 函数的重要警告。
    • 我也读过这部分,search_path 在示例中设置为admin, pg_temp,在您的评论中设置为pg_catalog,如果我的表A和表B属于公共模式,我应该设置search_path到public, pg_temp?我只是不太明白它是如何工作的..
    猜你喜欢
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    相关资源
    最近更新 更多