DO — ejecuta un bloque de código anónimo
DO [ LANGUAGEnombre_lenguaje]código
DO ejecuta un bloque de código anónimo, o en otras
palabras, una función anónima transitoria en un lenguaje procedimental.
El bloque de código se trata como si fuera el cuerpo de una función
sin parámetros, devolviendo void. Se analiza y
ejecuta una sola vez.
La cláusula opcional LANGUAGE se puede escribir tanto
antes como después del bloque de código.
código
El código del lenguaje procedimental que se va a ejecutar. Debe especificarse
como un literal de cadena, exactamente igual que en CREATE FUNCTION.
Se recomienda el uso de un literal entrecomillado con dólares (dollar-quoted).
nombre_lenguaje
El nombre del lenguaje procedimental en el que está escrito el código.
Si se omite, el valor predeterminado es plpgsql.
El lenguaje procedimental que se va a utilizar ya debe estar instalado
en la base de datos actual mediante CREATE EXTENSION.
plpgsql viene instalado por defecto, pero otros lenguajes no.
El usuario debe tener el privilegio USAGE para el lenguaje
procedimental, o debe ser un superusuario si el lenguaje no es de confianza (untrusted).
Este es el mismo requisito de privilegios que para crear una función
en dicho lenguaje.
Si DO se ejecuta en un bloque de transacción, el
código del procedimiento no puede ejecutar sentencias de control de transacciones. Las sentencias
de control de transacciones solo están permitidas si DO se ejecuta en
su propia transacción.
Conceder todos los privilegios sobre todas las vistas del esquema public al
rol webuser:
DO $$DECLARE r record;
BEGIN
FOR r IN SELECT table_schema, table_name FROM information_schema.tables
WHERE table_type = 'VIEW' AND table_schema = 'public'
LOOP
EXECUTE 'GRANT ALL ON ' || quote_ident(r.table_schema) || '.' || quote_ident(r.table_name) || ' TO webuser';
END LOOP;
END$$;
No existe la sentencia DO en el estándar SQL.