2010-06-11 1 views
77

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

ответ

84

Как насчет

DROP USER <username> 

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

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

Это лучше всего достигается за счет

REASSIGN OWNED BY <olduser> TO <newuser> 

и

DROP OWNED BY <olduser> 

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

См. Документы postgres для DROP ROLE и the more detailed description.


Дополнение

Видимо, пытаясь удалить пользователя с помощью команд, упомянутых здесь будет работать только если вы выполняете их, будучи подключены к одной и той же базе данных, что первоначальные ГРАНТЫ были сделаны из, как описано здесь:

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

+9

Выполнение: 'CREATE TABLE foo (bar SERIAL); ALTER TABLE foo ВЛАДЕЛЕЦ В postgres; CREATE USER testuser; GRANT ALL ON foo TO testuser; DROP USER testuser' дал сообщение об ошибке: 'ERROR: роль" testuser "не может быть удалена, потому что некоторые объекты зависят от него. DETAIL: доступ к таблице foo'. Тем не менее, 'DROP OWNED BY testuser' сделал трюк, очевидно, Postgres считает, что гранты являются недоступными объектами. – millimoose

+1

Просьба пояснить, @Tim Kane и millimoose: я действительно не хочу, чтобы исходные таблицы были удалены, если я ПРЕДОСТАВЛЯЕТ ВЫБРАТЬ НА FOO TO TESTUSER, а затем DROP OWNED BY TESTUSER. Я думаю, вы говорите, что DROP OWNED BY просто отбрасывает гранты, но не отбрасывает объект, на который был сделан грант. Верный? –

+1

Andrew, лучше всего ознакомиться с документацией для уточнения. DROP OWNED BY * будет * удалять таблицы, принадлежащие этому пользователю. REASSIGN OWNED BY переназначает эти таблицы другому пользователю. Выбери один. –

8

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

CONNECT ON DATABASE xxx TO GROUP,

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

REVOKE CONNECT ON DATABASE xxx FROM GROUP

-9

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

Я создал пользователя с именем msf и попытался удалить пользователя и восстановить его. Я последовал за нижеследующими шагами, и Got преуспел.

1) Отбросьте базу данных

dropdb msf 

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

dropuser msf 

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

+1

Этот подход невероятно слэш-и-ожог, так как он потребовал бы, чтобы я заново создавал схему базы данных для каждой итерации моей работы. (Это связано с наличием мелкомасштабных разрешений для существующей схемы базы данных, то есть лучше всего, если схема базы данных остается нетронутой.) – millimoose

1

Принятый ответ привел к ошибкам для меня при попытке ЗАПИСАТЬСЯ СОБСТВЕННЫМ ИЛИ ПОТЕРЯНЫМ СОБСТВЕННЫМ.Следующие работал для меня:

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 линию «общественного» заменить на правильную схему. Для того, чтобы показать все схемы и типов привилегий для пользователя, я редактировал команду \ дп, чтобы сделать этот запрос:

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%'; 

я не уверен, какие типы привилегий соответствуют отменив на ТАБЛИЦЫ, ПОСЛЕДОВАТЕЛЬНОСТИ, или функции, но я думаю, что все они подпадают под одну из трех.

Смежные вопросы