Hay algunos requisitos de permisos muy poco intuitivos al usar REASSIGN
.
Descubrí que cuando una cuenta de superusuario no está disponible (como en el caso de RDS o Cloud SQL) tengo que otorgar la función de destino a mi función actual para reasignar o quitar objetos propios de la función de destino. Por ejemplo, si mi usuario activo es postsgres
, y estoy tratando de eliminar user_a
:
> DROP OWNED BY user_a
ERROR: permission denied to drop objects
> GRANT user_a TO postgres;
GRANT ROLE
> DROP OWNED BY user_a;
DROP OWNED
Ahora, se vuelve un poco más complicado si user_a
pasa a ser miembro de postgres
, especialmente si hereda esa membresía a través de algún otro rol, llamémoslo schema_admin
...
> DROP OWNED BY user_a
ERROR: permission denied to drop objects
> GRANT user_a TO postgres;
ERROR: role "user_a" is a member of role "postgres"
-- Alright, let's try to revoke it...
> REVOKE postgres FROM user_a;
REVOKE ROLE
> GRANT user_a TO postgres;
ERROR: role "user_a" is a member of role "postgres"
-- It's still a member through the inherited grant - trying to revoke again doesn't work:
> REVOKE postgres FROM user_a;
WARNING: role "user_a" is not a member of role "postgres"
REVOKE ROLE
-- So you have to identify the role it's inheriting from, and revoke that:
> REVOKE schema_admin FROM user_a;
REVOKE ROLE
> GRANT user_a TO postgres;
GRANT ROLE
-- Now just to be safe, I'll reassign owned objects before actually dropping everything:
> REASSIGN OWNED BY user_a TO postgres;
REASSIGN OWNED
> DROP OWNED BY user_a;
DROP OWNED
> DROP ROLE user_a;
DROP ROLE;
¡Voilá!
Nota:aquí hay otra respuesta efectiva y ampliamente referenciada:https://sysadmintips.com/services/databases/postgresql-error-permission-denied-to-reasign-objects/ lo cual funciona muy bien, siempre que pueda crear e iniciar sesión como un nuevo usuario temporal. Sin embargo, en algunos contextos, eso es un problema en sí mismo (y luego también tiene que manejar la limpieza adicional de eliminar ese rol temporal cuando haya terminado), así que traté de evitar eso aquí.