Подтвердить что ты не робот

Роль отгрузки PostgreSQL не выполняется из-за привилегий по умолчанию

Я пытаюсь удалить роль "xyz", которая ранее была владельцем схемы с тем же именем "xyz". Я изменил право собственности на схему, как показано ниже, и запустил переназначенное право собственности на всякий случай (хотя все таблицы были созданы другим пользователем с полномочием суперпользователя). Поэтому я запускаю все это:

alter schema xyz owner to postgres;
reassign owned by xyz to postgres;
alter default privileges in schema seeds revoke all on tables from xyz cascade;
alter default privileges in schema seeds revoke all on sequences from xyz cascade;
alter default privileges in schema seeds revoke all on functions from xyz cascade;

И все еще получаю ошибку:

drop role xyz;
ERROR:  role "xyz" cannot be dropped because some objects depend on it
DETAIL:  owner of default privileges on new relations belonging to role xyz in schema xyz

Также FYI:

postgres=# \du rsi
List of roles
Role name |   Attributes   | Member of   
-----------+----------------+-----------
rsi       | No inheritance | {}

Что мне не хватает? Любая помощь будет оценена! Спасибо!!

4b9b3361

Ответ 1

Взято из документации PostgreSQL в ALTER DEFAULT PRIVILEGES, раздел "Примечания":

Если вы хотите отбросить роль, для которой были изменены привилегии по умолчанию, необходимо отменить изменения в своих привилегиях по умолчанию или использовать DROP OWNED BY, чтобы избавиться от записи привилегий по умолчанию для этой роли.

Другим достойным упоминанием в документации по DROP OWNED BY в этом случае также является

Поскольку DROP OWNED влияет только на объекты в текущей базе данных, обычно необходимо выполнить эту команду в каждой базе данных, содержащей объекты, принадлежащие роли, которая должна быть удалена.

Следовательно, ваш пробег может отличаться, что означает, что вам, возможно, придется выдать отчет в большее количество БД.

Получив те же сообщения, что и в вопросе, я опробовал инструкцию DROP OWNED BY, и она сработала. Надеюсь, это поможет!

Ответ 2

Команда первого запуска:

DROP OWNED BY xyz;

затем:

DROP ROLE xyz;

Прочтите документацию PostgreSQL, касающуюся Drop Owned By.