A resposta aceita resultou em erros para mim ao tentar REASSIGN OWNED BY ou DROP OWNED BY. O seguinte funcionou para mim:
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;
O usuário pode ter privilégios em outros esquemas; nesse caso, você precisará executar a linha REVOKE apropriada com "public" substituído pelo esquema correto. Para mostrar todos os esquemas e tipos de privilégios para um usuário, editei o comando \ dp para fazer esta consulta:
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%';
Não tenho certeza de quais tipos de privilégios correspondem à revogação em TABLES, SEQUENCES ou FUNCTIONS, mas acho que todos eles se enquadram em um dos três.
CREATE TABLE foo(bar SERIAL); ALTER TABLE foo OWNER TO postgres; CREATE USER testuser; GRANT ALL ON foo TO testuser; DROP USER testuser
deu as mensagens de erro:ERROR: role "testuser" cannot be dropped because some objects depend on it DETAIL: access to table foo
. No entanto,DROP OWNED BY testuser
como o truque, aparentemente o Postgres considera que as doações são objetos descartáveis.