Cannot drop PostgreSQL role. Error: `cannot be dropped because some objects depend on it`

DROP USER (or DROP ROLE, same thing) cannot proceed while the role still owns anything or has any granted privileges on other objects.

Get rid of all privileges with DROP OWNED (which isn’t too obvious from the wording). The manual:

[…] Any privileges granted to the given roles on objects in the current
database and on shared objects (databases, tablespaces) will also be revoked.

So the reliable sequence of commands to drop a role is:

REASSIGN OWNED BY ryan TO postgres;  -- or some other trusted role
DROP OWNED BY ryan;

Run both commands in every database of the same cluster where the role owns anything or has any privileges!
And finally:

DROP USER ryan;
  • REASSIGN OWNED changes ownership for all objects currently owned by the role.
  • DROP OWNED then only revokes privileges (ownerships out of the way).

Alternatively, you can skip REASSIGN OWNED. Then DROP OWNED will (also) drop all objects owned by the user. (Are you sure?!)

Related:

  • Drop a role with privileges (with a function to generate commands for all relevant DBs)
  • Find objects linked to a PostgreSQL role

Leave a Comment