On Tue, Jul 30, 2019 at 3:24 PM Federico Pascual
<federico.pasc...@gmail.com> 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


Reply via email to