When you try to drop a user in a PostgreSQL database, you may encounter this error:
postgres=# drop role scott; ERROR: role "scott" cannot be dropped because some objects depend on it DETAIL: privileges for database mydb01
Solution: Drop the user's objects first:
postgres=# drop owned by scott; DROP OWNED
Dropping can now proceed:
postgres=# drop role scott; DROP ROLE
If you get errors like:
postgres=# drop role scott; ERROR: role "scott" cannot be dropped because some objects depend on it DETAIL: privileges for database mydb02 25 objects in database mydb02
You need to open a connection to mydb02 and revoke the privileges, like this:
postgres=# \connect mydb02 You are now connected to database "mydb02" as user "postgres".
Try dropping the role now, and you'll get a list of objects with dependencies (the list is abbriviated):
mydb02=# drop role scott; ERROR: role "scott" cannot be dropped because some objects depend on it DETAIL: privileges for sequence my_seq1 privileges for sequence my_seq2 privileges for sequence my_seq3 privileges for table mytable1 privileges for table mytable2 privileges for table mytable3 privileges for schema public
Revoke access to all the public tables:
mydb02=# revoke all on all tables in schema public from scott; REVOKE
When you attempt to drop the role now, you can see that all the tables previously listed are gone:
mydb02=# drop role scott; ERROR: role "scott" cannot be dropped because some objects depend on it DETAIL: privileges for sequence my_seq1 privileges for sequence my_seq2 privileges for sequence my_seq3 privileges for schema public
Privileges to sequences and a schema remains. Revoke access to the sequences:
mydb02=# revoke all on all sequences in schema public from scott; REVOKE mydb02=# drop role scott; ERROR: role "scott" cannot be dropped because some objects depend on it DETAIL: privileges for schema public
Revoke the final privilege:
mydb02=# revoke usage on schema public from scott; REVOKE
Finally, we can drop the role:
mydb02=# drop role scott; DROP ROLE