Прийнята відповідь призвела до помилок для мене при спробі ПРИЗНАЧЕННЯ, ВЛАСНОГО або ВІДМОВЕНО ВЛАСНИМИ. Для мене працювало наступне:
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%';
Я не впевнений, які типи привілеїв відповідають відкликанню таблиць, послідовностей чи функцій, але я думаю, що всі вони підпадають під одну з трьох.
CREATE TABLE foo(bar SERIAL); ALTER TABLE foo OWNER TO postgres; CREATE USER testuser; GRANT ALL ON foo TO testuser; DROP USER testuser
дали повідомлення про помилки:ERROR: role "testuser" cannot be dropped because some objects depend on it DETAIL: access to table foo
. Однак,DROP OWNED BY testuser
хитрість, очевидно, Постгрес вважає гранти об'єктами, що підлягають видаленню.