liquibase:dropAll также должен удалять триггерные функции.

У меня есть база данных PostgreSQL, настроенная с использованием Liquibase. Когда я запускаю liquibase:dropAll с помощью maven, он сбрасывает мне все, кроме триггерных функций. Есть ли способ, чтобы с этой целью maven также отбрасывались триггерные функции?

Поскольку, когда я повторно применяю свой набор изменений после dropAll, он не может создать уже существующие функции.


person Tarion    schedule 12.03.2014    source источник


Ответы (1)


К сожалению нет. Способ реализации dropAll заключается в том, что он использует функцию моментального снимка liquibase для поиска всех объектов, которые нужно удалить, что работает нормально, за исключением типов объектов, которые не ищутся моментальным снимком. Snapshot обрабатывает стандартные типы, такие как таблицы, столбцы, представления и последовательности, но не затрагивает более специфичные для базы данных типы, такие как триггеры, функции, процедуры, определяемые пользователем типы и т. д. Поскольку моментальный снимок не знает о триггерах, dropAll не может знать, как их удалить .

Если вы используете postgresql, проще всего просто запустить

drop schema public cascade;
create schema public;

как описано в разделе «Удалить все таблицы в PostgreSQL?", а не использовать liqubase dropAll.

person Nathan Voxland    schedule 12.03.2014
comment
Или вы знаете способ выполнить дополнительный SQL, подобный тому, который вы разместили на liquibase:dropAll? - person Tarion; 12.03.2014
comment
Нет встроенного способа, но приведенный выше SQL заменит то, что делает dropAll в любом случае. - person Nathan Voxland; 12.03.2014
comment
У Liquibase действительно есть богатая система расширений, которая позволит вам добавить поддержку моментальных снимков, а затем отбрасывать триггеры. Мой ответ в stackoverflow.com/questions/22172239/ описывает, как это сделать для хранимых процессов, но триггеры будут похожи - person Nathan Voxland; 12.03.2014
comment
Другой вариант — drop owned by ... cascade, который избавит вас от всех объектов базы данных, принадлежащих конкретному пользователю. Я обычно использую это, особенно если задействовано более одной схемы. - person a_horse_with_no_name; 13.03.2014