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

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

Ответы [ 5 ]

117 голосов
/ 11 июня 2010

Как насчет

DROP USER <username>

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

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

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

REASSIGN OWNED BY <olduser> TO <newuser>

и

DROP OWNED BY <olduser>

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

См. Документацию postgres для DROP ROLE и , более подробное описание этого.


Дополнительно:

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

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

33 голосов
/ 05 января 2018

Принятый ответ привел к ошибкам для меня при попытке РЕАССИРОВАНИЯ OWNED BY или DROP OWNED BY.У меня сработало следующее:

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;

Пользователь может иметь привилегии в других схемах, в этом случае вам придется запустить соответствующую строку REVOKE с заменой «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%';

Я не уверен, какие типы привилегий соответствуют отмене в TABLES, SEQUENCES илиФУНКЦИИ, но я думаю, что все они подпадают под одну из трех.

14 голосов
/ 01 марта 2013

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

CONNECT ON DATABASE xxx TO GROUP,

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

REVOKE CONNECT ON DATABASE xxx FROM GROUP

2 голосов
/ 03 мая 2019

Мне пришлось добавить еще одну строку в REVOKE ...

После запуска:

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;

Я все еще получал ошибку: имя пользователя не может быть удалено, поскольку некоторые объектызависит от него ДЕТАЛИ: привилегии для публичной схемы

Мне не хватало этого:

REVOKE USAGE ON SCHEMA public FROM username;

Тогда я смог отбросить роль.

DROP USER username;
0 голосов
/ 09 декабря 2015

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

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

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

dropdb msf

2) уронить пользователя

dropuser msf

Теперь пользователь успешно удален.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...