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