La respuesta aceptada resultó en errores para mí al intentar REASIGNAR PROPIEDAD DE o DROP OWNED BY. Lo siguiente funcionó para mí:
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;
El usuario puede tener privilegios en otros esquemas, en cuyo caso tendrá que ejecutar la línea REVOKE apropiada con "público" reemplazado por el esquema correcto. Para mostrar todos los esquemas y tipos de privilegios de un usuario, edité el comando \ dp para realizar 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%';
No estoy seguro de qué tipos de privilegios corresponden a la revocación en TABLAS, SECUENCIAS o FUNCIONES, pero creo que todos caen bajo uno de los tres.
CREATE TABLE foo(bar SERIAL); ALTER TABLE foo OWNER TO postgres; CREATE USER testuser; GRANT ALL ON foo TO testuser; DROP USER testuser
dio a los mensajes de error:ERROR: role "testuser" cannot be dropped because some objects depend on it DETAIL: access to table foo
. Sin embargo,DROP OWNED BY testuser
hizo el truco, aparentemente Postgres considera que las subvenciones son objetos soltables.