Есть проблема. Необходимо удалить пользователя, которому назначены GRANTы. Postgresql удалять таких пользователей отказывается, ссылаясь на то что есть зависимые объекты. И возникает вопрос как удалить таких пользователей, вместе со всеми их GRANTами? Получить все гранты и по одному удалять не сильно хочется.
ЗЫ. Коротко, о проблеме:
test=# CREATE USER test_user;
CREATE ROLE
test=# GRANT ALL ON users TO test_user ;
GRANT
test=# DROP USER test_user ;
ERROR: role "test_user" cannot be dropped because some objects depend on it
DETAIL: access to таблица users
test=#
А зачем
А зачем получать все гранты и удалять по одному?
Может быть попробовать:
Не помогло
test=> REVOKE ALL PRIVILEGES ON DATABASE testdb FROM a;
REVOKE
test=> DROP ROLE test;
ERROR: role "test" cannot be dropped because some objects depend on it
DETAIL: access to function xxx0
access to function xxx1
access to function xxx2
Вот.
А отрабатывает
А отрабатывает ли нормально системная команда dropuser?
И ещё если к предыдущей конструкции добавить в конце CASCADE, может быть это поможет?
Ради интереса
Ради интереса проверил вариант с CASCADE, результат тот же. Гранты с объектов не убираются. Системную команду тоже попробовал, с тем же эффектом. Кстати в манах говориться что системная команда запускает тот же DROP USER (DROP ROLE) : "... dropuser is a wrapper around the SQL command DROP ROLE. There is no effective difference between dropping users via this utility and via other methods for accessing the server." (c)
http://postgresql.ru.net/manual/app-dropuser.html
У меня была
У меня была надежда, что системная команда более интеллектуальна!
Тогда остаётся найти как получить список объектов, к которым привязана роль. Интересная задача!
http://postgresql.ru.net/manu
http://postgresql.ru.net/manual/sql-droprole.html
A role cannot be removed if it is still referenced in any database of the cluster; an error will be raised if so. Before dropping the role, you must drop all the objects it owns (or reassign their ownership) and revoke any privileges the role has been granted. The REASSIGN OWNED and DROP OWNED commands can be useful for this purpose.
Эх, не внимательность ...
Упустил из виду когда маны читал Ну что ж, спасибо за помощь господа. Придётся всё-таки гранты с каждого объекта по отдельности убирать.
все права (взял
все права (взял у EMS SQL Manager'a)
Вот способ
Вот способ получить все права пользователя . Что дальше с ними делать - решайте сами
ЗЫ "другие объекты" можно подсмотреть в pg_class.relkind