Есть ли способ наследовать таблицу, которая не принадлежит текущему пользователю

#postgresql #database-permissions

#postgresql #база данных-разрешения

Вопрос:

Я создаю двух пользователей в моей базе данных PostgreSQL. скажем, migration и dev .

Я создаю таблицу A с пользователем migration . Затем я создаю таблицу, B которая наследует таблицу A от имени пользователя dev , но это не удается.

 ERROR:  must be owner of relation A
  

Если я не хочу изменять владельца таблицы, есть ли другой способ заставить это работать?

Ответ №1:

Один из способов — использовать роль, членами которой являются оба пользователя:

 CREATE ROLE tab_owner NOLOGIN NOINHERIT;

GRANT tab_owner TO dev, migration;
  

Теперь, когда migration создается таблица, она сначала запускается:

 SET ROLE tab_owner;
  

Тогда таблица принадлежит роли.

Пользователь dev делает то же самое перед созданием дочернего элемента наследования таблицы.

Комментарии:

1. Спасибо @Laurenz Albe, На самом деле я упрощаю вариант использования в моем вопросе, реальный случай таков: я хочу использовать таблицу разделов по наследству. итак, я создаю и автоматически запускаю операцию вставки, когда вставляю строку данных, она автоматически создает дочернюю таблицу по времени создания, и это не удалось по вышеуказанной причине, вот почему я создаю этот вопрос. После того, как я проведу некоторое расследование, я решил это с помощью SECURITY DEFINER.

2. Используйте триггерную функцию, принадлежащую владельцу таблицы, и определите ее как SECURITY DEFINER . Не забудьте SET search_path = pg_catalog в объявлении функции.

3. На самом деле меня смущает этот search_path, я вижу, что в документе упоминалось об этом, и я не совсем уверен, для чего он использовался, в настоящее время я устанавливаю его следующим образом: SET search_path = public, pg_temp; есть ли здесь какая-либо проблема?

4. Извините за излишнюю краткость, я имел в виду это важное предупреждение о SECURITY DEFINER функциях в документации.

5. Я также прочитал эту часть, в примере для search_path установлено значение admin, pg_temp , и pg_catalog в вашем комментарии, если мои таблицы A и B принадлежат общедоступной схеме, должен ли я установить для search_path значение public, pg_temp ? Я просто не совсем понимаю, как это работает..