【问题标题】:Creating child table of parent table using user other than admin in postgres在postgres中使用管理员以外的用户创建父表的子表
【发布时间】:2017-06-16 17:57:51
【问题描述】:

假设我有一个名为“user”的父表 CREATE TABLE,它是由超级用户“postgres”创建的。 现在我想创建该父表的子表,如

CREATE TABLE public.user_child
()
INHERITS (public.user) 

但是有两个问题。 1)我想使用其他用户创建那个孩子,比如说“实习生”,可能没有像超级用户这样的特权。 2)我想在函数中动态创建该表。

但它显示“实习生”必须是“用户”的所有者才能创建其子级的错误。 有什么解决办法吗?

【问题讨论】:

    标签: sql postgresql postgis


    【解决方案1】:

    您可以使用SECURITY DEFINER 创建一个由超级用户拥有的函数,该函数创建新的子表,然后将表所有权更改为session_user

    这需要带有EXECUTE 的动态SQL。

    PUBLIC 撤消此函数的EXECUTE 权限,并将其授予应允许创建子表的用户。

    【讨论】:

    • 这有点道理。但在我的情况下,有多个用户,我试图在分区中维护他们的日志。因此,我正在动态检查即将到来的日志以及用户名。如果未找到所需的分区,则该分区将由该日志条目所在的用户创建。由于父级为超级用户所有,其他用户无法动态创建分区。
    • BEGIN partition_date := to_char(NEW.date,'YYYY_MM'); partition_name := TG_RELNAME || '_' ||分区日期; IF NOT EXISTS(SELECT relname FROM pg_class WHERE relname=partition_name) THEN q :=' CREATE TABLE ' ||报价标识(分区名称)|| ' () 继承父级;';执行万一;返回空值;结尾;如果由超级用户以外的其他用户触发,这部分函数会给出所有权错误。
    • 然后在超级用户拥有的SECURITY DEFINER 函数中执行此操作。问题出在哪里?我不知道“传入日志”是什么或“由用户从日志条目的来源创建表”。你调用我建议的函数,而不是运行上面的代码。
    猜你喜欢
    • 2014-01-04
    • 1970-01-01
    • 2021-03-05
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 2019-05-17
    相关资源
    最近更新 更多