Как обеспечить в Luquibase порядок изменений на уровне базы данных?

Мы давно использовали отдельные журналы изменений для каждой базы данных. Но теперь я столкнулся с проблемой. Я хочу внести изменения в две базы данных, где сценарий для одной базы данных может быть успешно выполнен только после завершения другого сценария.

Я попытался внести оба изменения в единый журнал, но при запуске Liquibase обнаружил ошибку «блокировка журнала изменений».

пс. Снятие блокировки в базе с помощью этого скрипта не помогло.

UPDATE DATABASECHANGELOGLOCK SET LOCKED=0, LOCKGRANTED=null, LOCKEDBY=null where ID=1;

person user3603470    schedule 19.07.2017    source источник
comment
Не могли бы вы подробнее рассказать о шагах, которые вы обычно предпринимаете, и о шагах, которые вы пытаетесь предпринять? У меня есть приблизительное представление о том, что вы пытаетесь сделать, но я не знаю, как вы пытаетесь это сделать.   -  person CheeseFerret    schedule 19.07.2017
comment
@CheeseFerret, У нас на одном экземпляре ms sql несколько баз данных. И некоторые sql для этих баз охватывают объекты из нескольких. Итак, на этот раз мы должны добавить облако в представление, а также обновить процедуру в другой базе данных, чтобы она использовала этот столбец. Проблема в том, что мы должны убедиться, что представление будет обновлено перед процедурой, чтобы последнее могло быть обновлено успешно. Но с отдельными журналами для каждой базы данных я не знаю, как это сделать.   -  person user3603470    schedule 21.07.2017
comment
Порядок обновления базы данных (по отдельным журналам изменений) мы определяем в нашей конфигурации CI.   -  person user3603470    schedule 21.07.2017


Ответы (1)


Я предлагаю вам изучить Контекст.

«Контексты» в Liquibase - это теги, которые вы можете добавить в changeSets для управления, которые будут выполняться при любом конкретном запуске миграции. В качестве имени контекста можно использовать любую строку, и они проверяются без учета регистра.

Когда вы запускаете мигратор с помощью любого из доступных методов, вы можете передать набор контекстов для запуска. Будут запущены только changeSets, отмеченные переданными контекстами.

Возможное решение:

  1. Добавьте db1 контекст для наборов изменений, которые необходимо запустить в первой БД, и db2 контекст, который необходимо запустить во второй БД.
  2. Вы уже поместили оба изменения в единый журнал.
  3. Теперь вам просто нужно дважды запустить Liquibase. Первый раз с контекстом db1, второй раз с db2. (Второе выполнение может зависеть от результата первого.)
person Albert    schedule 24.07.2017