Удаление пользователей

Изображение Loki

Есть проблема. Необходимо удалить пользователя, которому назначены 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=#

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

А зачем

А зачем получать все гранты и удалять по одному?
Может быть попробовать:

REVOKE ALL PRIVILEGES ON DATABASE имя_БД

Не помогло

Изображение Loki

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, может быть это поможет?

Ради интереса

Изображение Loki

Ради интереса проверил вариант с 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.

Эх, не внимательность ...

Изображение Loki

Упустил из виду когда маны читал :( Ну что ж, спасибо за помощь господа. Придётся всё-таки гранты с каждого объекта по отдельности убирать.

все права (взял

все права (взял у EMS SQL Manager'a)

SELECT c.relkind AS objtype,
        c.relname AS object,
        n.nspname,
        u.usename AS owner,
        c.relacl AS acl,
        c.oid
 FROM pg_class c
      LEFT OUTER JOIN pg_user u ON c.relowner = u.usesysid
      INNER JOIN pg_namespace n ON n.oid = c.relnamespace
 WHERE c.relkind IN ('r', 'S', 'v')
 UNION ALL
 SELECT 'D' <img class="ccfilter smileys" src="https://pgdocs.ru/sites/all/modules/ccfilter/smileys/aj.gif" alt="::" title="::" />pg_catalog.char AS objtype,
        d.datname AS object,
        ''::name AS nspname,
        u.usename AS owner,
        d.datacl AS acl,
        d.oid
 FROM pg_database d
      LEFT OUTER JOIN pg_user u ON d.datdba = u.usesysid
 UNION ALL
 SELECT 'F' <img class="ccfilter smileys" src="https://pgdocs.ru/sites/all/modules/ccfilter/smileys/aj.gif" alt="::" title="::" />pg_catalog.char AS objtype,
        p.proname AS object,
        n.nspname,
        u.usename AS owner,
        p.proacl AS acl,
        p.oid
 FROM pg_proc p
      LEFT OUTER JOIN pg_user u ON p.proowner = u.usesysid
      INNER JOIN pg_namespace n ON n.oid = p.pronamespace
 UNION ALL
 SELECT 'L' <img class="ccfilter smileys" src="https://pgdocs.ru/sites/all/modules/ccfilter/smileys/aj.gif" alt="::" title="::" />pg_catalog.char AS objtype,
        l.lanname AS object,
        ''::name AS nspname,
        ''::name AS owner,
        l.lanacl AS acl,
        l.oid
 FROM pg_language l
 UNION ALL
 SELECT 'N' <img class="ccfilter smileys" src="https://pgdocs.ru/sites/all/modules/ccfilter/smileys/aj.gif" alt="::" title="::" />pg_catalog.char AS objtype,
        n.nspname AS object,
        ''::name AS nspname,
        u.usename AS owner,
        n.nspacl AS acl,
        n.oid
 FROM pg_namespace n
      LEFT OUTER JOIN pg_user u ON n.nspowner = u.usesysid
 UNION ALL
 SELECT 'T' <img class="ccfilter smileys" src="https://pgdocs.ru/sites/all/modules/ccfilter/smileys/aj.gif" alt="::" title="::" />pg_catalog.char AS objtype,
        s.spcname AS object,
        ''::name AS nspname,
        u.usename AS owner,
        s.spcacl AS acl,
        s.oid
 FROM pg_tablespace s
      LEFT OUTER JOIN pg_user u ON s.spcowner = u.usesysid

Вот способ

Изображение Loki

Вот способ получить все права пользователя . Что дальше с ними делать - решайте сами ;)

SELECT * FROM (
 
SELECT
	c.oid AS oid,
	c.relacl::text AS rights,
	CASE	WHEN c.relkind = 'r' THEN 'TABLE '|| n.nspname||'.'||c.relname
		WHEN c.relkind = 'v' THEN 'VIEW '|| n.nspname||'.'||c.relname
-- други объекты. 
	END AS name
FROM pg_class c
	JOIN pg_namespace n ON c.relnamespace = n.oid
WHERE n.nspname = 'схема'  AND (relkind = 'r' OR relkind = 'v' /* OR другие объекты */)
 
UNION
 
SELECT
	p.oid AS oid,
	p.proacl::text AS rights,
	'FUNCTION '||n.nspname||'.'||p.proname AS name
FROM pg_proc p
	JOIN pg_namespace n ON p.pronamespace = n.oid
WHERE n.nspname = 'схема'
) AS zzz
WHERE rights ILIKE '%,пользователь=%' OR rights ILIKE '%{пользователь=%';

ЗЫ "другие объекты" можно подсмотреть в pg_class.relkind

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023