On Tue, Jul 30, 2019 at 3:24 PM Federico Pascual
<[email protected]> wrote:
>
> Yo quisiera algo como:
>
> revoke all privileges on all tables on schema <schema name> from all fucking
> world;
>
> Esta es la referencia más cercana que encontré a lo que quiero:
> http://www.postgresonline.com/journal/index.php?/archives/221-Bulk-Revoke-of-Permissions-for-Specific-GroupUser-role.html
>
> Quisiera evitar tener que exportar la db con la cláusula que evita la
> asignación de permisos para tener que reimportarla.
>
De la lógica que quieres, la única parte que no puedes hacer en una
única instrucción es el 'from all roles'. Tienes que iterar por cada
uno de los roles a los que les vas a hacer el 'revoke'. En cualquier
caso, te recomendaría no quitar los privilegios a los dueños del
esquema.
Con SQL encadenado puedes generar las instrucciones. Y con PL/pgSQL
puedes automatizarlo:
DO $$
DECLARE rol record;
BEGIN
FOR rol IN
SELECT r.rolname, nsp.nspname
FROM pg_roles r
CROSS JOIN pg_namespace nsp
WHERE nsp.nspowner <> r.oid AND nsp.nspname = '<schema_name>'
LOOP
RAISE NOTICE 'REVOKE ALL ON ALL TABLES IN SCHEMA % FROM %',
rol.nspname, rol.rolname;
RAISE NOTICE 'REVOKE ALL ON ALL SEQUENCES IN SCHEMA % FROM %',
rol.nspname, rol.rolname;
RAISE NOTICE 'REVOKE ALL ON ALL FUNCTIONS IN SCHEMA % FROM %',
rol.nspname, rol.rolname;
--EXECUTE 'REVOKE ALL ON ALL TABLES IN SCHEMA ' ||
quote_ident(rol.nspname) || ' FROM ' || quote_ident(rol.rolname);
--EXECUTE 'REVOKE ALL ON ALL SEQUENCES IN SCHEMA ' ||
quote_ident(rol.nspname) || ' FROM ' || quote_ident(rol.rolname);
--EXECUTE 'REVOKE ALL ON ALL FUNCTIONS IN SCHEMA ' ||
quote_ident(rol.nspname) || ' FROM ' || quote_ident(rol.rolname);
END LOOP;
END$$;
Asegúrate que esta es la funcionalidad que buscas antes de quitar los
comentarios.
Un saludo,
Juan José Santamaría Flecha