DO — выполнение анонимного блока кода
DO [ LANGUAGElang_name]code
DO выполняет анонимный блок кода или, другими словами,
временную анонимную функцию на процедурном языке.
Блок кода обрабатывается так, как если бы он был телом функции
без параметров, возвращающей void. Он разбирается и
выполняется один раз.
Необязательное предложение LANGUAGE может быть написано как
до, так и после блока кода.
code
Код процедурного языка для выполнения. Он должен быть указан
как строковый литерал, как и в CREATE FUNCTION.
Рекомендуется использовать долларовые кавычки.
lang_name
Имя процедурного языка, на котором написан код.
Если опущено, по умолчанию используется plpgsql.
Используемый процедурный язык уже должен быть установлен
в текущую базу данных с помощью команды CREATE EXTENSION.
Язык plpgsql устанавливается по умолчанию, но другие языки — нет.
Пользователь должен иметь привилегию USAGE для процедурного
языка или быть суперпользователем, если язык является недоверенным.
Это те же требования к привилегиям, что и для создания функции
на этом языке.
Если DO выполняется в блоке транзакции, то
процедурный код не может выполнять операторы управления транзакциями.
Операторы управления транзакциями разрешены только если DO выполняется в
собственной транзакции.
Предоставить все привилегии на все представления в схеме public
роли 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$$;
Стандарт SQL не содержит оператора DO.