PostgreSQL-как быстро удалить пользователя с существующими привилегиями

Я пытаюсь сделать ограниченных пользователей БД для приложения, над которым я работаю, и я хочу удалить пользователя базы данных Postgres, который я использую для экспериментов. Есть ли способ удалить пользователя без необходимости сначала отозвать все его права вручную или отозвать все гранты пользователя?

4 ответов


как о

DROP USER <username>

это на самом деле псевдоним для DROP ROLE.

вы должны explicity отказаться от любых привилегий, связанных с этим пользователем, а также переместить свое право собственности на другие роли (или удалить объект).

это лучше всего достигается путем

REASSIGN OWNED BY <olduser> TO <newuser>

и

DROP OWNED BY <olduser>

последний удалит любые привилегии, предоставленные пользователю.

см. документы postgres для ПАДЕНИЕ РОЛИ и более подробная описание этого.


дополнение:

по-видимому, попытка удалить пользователя с помощью команд, упомянутых здесь, будет работать только в том случае, если вы выполняете их при подключении к той же базе данных, из которой были сделаны исходные гранты, как описано здесь:

https://www.postgresql.org/message-id/83894A1821034948BA27FE4DAA47427928F7C29922%40apde03.APD.Satcom.Local


также обратите внимание, если вы явно предоставили:

CONNECT ON DATABASE xxx TO GROUP ,

вам нужно будет отменить это отдельно от капли, принадлежащей, используя:

REVOKE CONNECT ON DATABASE xxx FROM GROUP


принятый ответ привел к ошибкам для меня при попытке переназначить принадлежит или падение принадлежит. Для меня сработало следующее:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username;
DROP USER username;

пользователь может иметь привилегии в других схемах, в этом случае вам придется запустить соответствующую строку отзыва с заменой "public" правильной схемой. Чтобы показать все схемы и типы привилегий для пользователя, я отредактировал команду \dp, чтобы сделать этот запрос:

SELECT 
  n.nspname as "Schema",
  CASE c.relkind 
    WHEN 'r' THEN 'table' 
    WHEN 'v' THEN 'view' 
    WHEN 'm' THEN 'materialized view' 
    WHEN 'S' THEN 'sequence' 
    WHEN 'f' THEN 'foreign table' 
  END as "Type"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE pg_catalog.array_to_string(c.relacl, E'\n') LIKE '%username%';

Я не уверен, какие типы привилегия соответствуют для отмены таблиц, последовательностей или функций, но я думаю, что все они подпадают под одну из трех.


я столкнулся с той же проблемой и нашел способ ее решить. Сначала вам нужно удалить базу данных пользователя, которую вы хотите удалить. Затем пользователь может быть легко удален.

Я создал пользователя с именем "msf" и некоторое время боролся, чтобы удалить пользователя и воссоздать его. Я пошел по нижним ступенькам и добился успеха.

1) удалить базу данных

dropdb msf

2) отбросьте пользователя

dropuser msf

теперь я получил пользователя успешно отброшен.