首页 > 解决方案 > 在 postgresql 中创建表分区的权限继承

问题描述

我有具有特殊权限集的分区表:

CREATE TABLE public.paritioned_table (
    _time int8 NULL,
    ...
) PARTITION BY RANGE (_time);

-- 权限

GRANT ALL ON TABLE public.paritioned_table TO someuser;

我有一个创建分区的触发器:

_partition := 'paritioned_table_' || to_char(to_timestamp(_time),'YYYY_MM');

IF NOT EXISTS(SELECT relname FROM pg_class WHERE relname = _partition) THEN
    RAISE NOTICE 'A partition has been created %', _partition;

    select extract(epoch FROM date_trunc('month', to_timestamp(_time))) into _from;
    select extract(epoch FROM date_trunc('month', to_timestamp(_time)) + INTERVAL '1 MONTH') into _to;

    execute 'CREATE TABLE ' || _partition || ' PARTITION OF paritioned_table FOR VALUES FROM (' || _from || ') TO (' || _to || ')';

END IF;

问题是新创建的分区不继承父故事权限。所以我的问题-创建具有权限继承的分区的最佳做法是什么

标签: postgresqlpermissionspartitioning

解决方案


使用每次运行的触发器INSERT来检查是否需要创建分区会降低一些性能。_time另外,如果有人输入-100000000000 ,您是否希望创建一个分区?

但是对于您的问题:分区是它们自己的表,并且没有关于继承权限或存储参数的规定。你有两个选择:

  • 向触发器添加GRANT语句。

  • 发出一条ALTER DEFAULT PRIVILEGE语句,为所有新创建的表(可能仅限于一个模式)设置默认权限。


推荐阅读