Как предоставить права на удаление таблицы / функции роли в PostgreSQL?

10

Я хочу предоставить dropпривилегии всем таблицам и функциям (не только тем, которые принадлежат пользователю) в определенной схеме конкретной базы данных для конкретной роли. Однако GRANT ALL PRIVILEGESэтого недостаточно, и я не нашел, как это сделать, не сделав роль суперпользователя - суперпользователь имеет права на другие базы данных на том же сервере, а это не то, чего я хочу. Я не возражаю против привилегий суперпользователя, ограниченных конкретной базой данных, но я не уверен, как это сделать.

Мой код:

CREATE USER _administrator PASSWORD 'pwd12345';
CREATE ROLE administrator NOLOGIN ADMIN _administrator;

GRANT ALL PRIVILEGES ON DATABASE "myDB" TO administrator;
GRANT ALL PRIVILEGES ON SCHEMA public TO administrator;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO administrator;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO administrator;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO administrator;

administratorэто группа myDBадминистраторов баз данных, _administratorэто самая мощная роль, в которую мое клиентское приложение сможет войти как.

Что я пропустил или сделал не так?

Павел В.
источник

Ответы:

11

Только владелец (и суперпользователи) могут удалять объекты. По документации:

Право удалить объект или каким-либо образом изменить его определение не рассматривается как предоставляемая привилегия; это присуще владельцу, и не может быть предоставлено или отменено. (Однако подобный эффект можно получить, предоставив или отменив членство в роли, которой принадлежит объект; см. Ниже.) Владелец неявно также имеет все параметры предоставления объекта.

Итак, создайте administrator себе такие объекты, которые пользователи смогут уронить.

ALTER FUNCTION foo() OWNER TO administrator;
ALTER TABLE foo      OWNER TO administrator;

И вы помните, что на самом деле предоставили членство в группе, верно?

GRANT administrator TO _administrator;
Эрвин Брандштеттер
источник