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



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

551   4  

4 ответов:

как о

DROP USER <username>

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

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

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

REASSIGN OWNED BY <olduser> TO <newuser>

и

DROP OWNED BY <olduser>

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

смотрите документы postgres для DROP ROLE и более подробная описание этого.


дополнение:

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

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

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

CONNECT ON DATABASE xxx TO GROUP,

вам нужно будет отменить это отдельно от DROP OWNED BY, используя:

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

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

Comments

    Ничего не найдено.