Наследование разрешений при создании раздела таблицы в postgresql - PullRequest
0 голосов
/ 09 января 2020

У меня есть секционированная таблица с установленными специальными разрешениями:

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;

Проблема в том, что новый созданный раздел не наследует родительские разрешения. Так что мой вопрос - как лучше создавать разделы с разрешениями наследования

1 Ответ

0 голосов
/ 09 января 2020

Использование триггера, который запускается на каждом INSERT для проверки необходимости создания раздела, снизит производительность. Кроме того, вы бы хотели, чтобы был создан раздел, если кто-то введет _time из -100000000000?

Но на ваш вопрос: разделы - это их собственные таблицы, и нет никаких условий для наследования разрешений или параметров хранения. У вас есть два варианта:

  • Добавить оператор GRANT к вашему триггеру.

  • Выполнить оператор ALTER DEFAULT PRIVILEGE, который устанавливает права по умолчанию для все вновь созданные таблицы (возможно, ограниченные схемой).

...