drop database - вызов из функции (postgres:12-alpine )

В рамках рабочего проекта часто приходится перенакатывать базу с нуля. В связи с чем решил на скорую руку написать скрипт, делающий это быстро. Написал примерно следующее

create or replace procedure dropTestDb(prefix varchar)
as
$$
declare
    dbname name;
begin
    FOR dbname in (select datname from pg_database where datname like prefix || '.%')
        LOOP
            EXECUTE 'REVOKE CONNECT ON DATABASE  "' || dbname || '" FROM public;';
            EXECUTE 'SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = ''' ||
                    dbname || ''' AND pid <> pg_backend_pid();';
            execute 'drop database "' || dbname || '" ';
            EXECUTE 'create database  "' || dbname || '"';
        END LOOP;
end
$$ LANGUAGE plpgsql;

На этапе выполнения падает ошибка [25001] ERROR: DROP DATABASE cannot be executed from a function

Ошибка понятна, документацию посмотрел(https://www.postgresql.org/docs/12/sql-dropdatabase.html). Нашёл вот такой ответ - https://stackoverflow.com/questions/15256793/drop-or-create-database-from-stored-procedure-in-postgresql .

Вопрос- всё же прошло больше 8 лет, мб появилось более красивое и аккуратное решение как обойти это ограничение, нежели db_link?


Ответы (0 шт):