Ву Дао. Как удалить пользователя/роль PostgreSQL с привилегиями
Это перевод статьи Vu Dao. How To Drop A Postgres Role/User With privileges.
Проблема
Не удаётся удалить роль PostgreSQL. Ошибка: не может быть удалена, потому что некоторые объекты зависят от неё
mydatabase=# DROP USER jack;
ERROR: role "jack" cannot be dropped because some objects depend on it
DETAIL: owner of view jacktest_view
owner of table jacktest
privileges for default privileges on new relations belonging to role postgres in schema public
postgres=# DROP USER jack;
ERROR: role "jack" cannot be dropped because some objects depend on it
DETAIL: 3 objects in database mydatabase
Просмотр привилегий
Прежде чем перейти к решению, посмотрим список всех привилегий роли:
mydatabase=# SELECT grantor, grantee, table_schema, table_name, privilege_type FROM information_schema.table_privileges WHERE grantee = 'jack';
grantor | grantee | table_schema | table_name | privilege_type
---------+---------+--------------+---------------+----------------
jack | jack | public | jacktest | TRUNCATE
jack | jack | public | jacktest | REFERENCES
jack | jack | public | jacktest | TRIGGER
jack | jack | public | jacktest_view | TRUNCATE
jack | jack | public | jacktest_view | REFERENCES
jack | jack | public | jacktest_view | TRIGGER
(6 rows)
mydatabase=# \ddp+
Default access privileges
Owner | Schema | Type | Access privileges
----------+--------+-------+---------------------
postgres | public | table | readonly=r/postgres+
| | | jack=arwd/postgres
(1 row)
Быстрый способ удалить пользователя
Подключившись к базе данных по умолчанию, выполнить команды:
postgres=# REASSIGN OWNED BY jack TO postgres;
postgres=# DROP OWNED BY jack;
Повторить приведённые выше команды, подключившись к базам данных, показанным в сообщении DETAIL: 3 objects in database mydatabase
:
mydatabase=# REASSIGN OWNED BY jack TO postgres;
mydatabase=# DROP OWNED BY jack;
mydatabase=# DROP USER jack;
Другой способ - отзыв привилегий
Так же можно сначала отозвать все привилегии из списка privilege_type
перед тем, как удалить пользователя:
postgres=# REVOKE TRUNCATE, REFERENCES, TRIGGER ON ALL TABLES IN SCHEMA public FROM jack;