#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
? Я просто не совсем понимаю, как это работает..