Ограничение сброса Liquibase, не зная его имени

Мы используем Liquibase для отслеживания изменений в нашей базе данных. Первый changeSet содержит следующие строки:

<column name="SHORT_ID" type="INTEGER">
   <constraints unique="true" />
</column>

В основном это означает, что столбец SHORT_ID имеет уникальное ограничение, но имя этого ограничения может быть любым и обычно различается каждый раз (мы запускаем некоторые интеграционные тесты для баз данных H2, и новые базы создаются каждый раз, когда мы запускаем тесты)

Итак ... проблема: я не могу изменить этот первый набор изменений, но теперь мы должны избавиться от этого уникального ограничения. Есть идеи, как этого добиться с помощью Liquibase?


person vrm    schedule 01.09.2010    source источник


Ответы (3)


SQL-код H2 для удаления ограничений требует имени ограничения. Я не помню, является ли автоматически сгенерированное имя ограничения в H2 случайным или согласованным между базами данных.

Если он постоянный, вы можете использовать обычный тег Liquibase, и он будет работать нормально.

Если он случайный, вам нужно будет получить имя ограничения из information_schema. H2 может допускать что-то вроде:

alter table TABLE_NAME drop constraint 
      (select unique_index_name 
              from information_schema.constraints 
              where table_name='TABLE_NAME' and column_name='SHORT_ID')

В противном случае вам может потребоваться создать собственное изменение ликвибазы (http://liquibase.org/extensions с 2.0, http://www.liquibase.org/manual/custom_refactoring_class в 1.9), который вызывает и снимает ограничение.

person Nathan Voxland    schedule 01.09.2010
comment
Пробовал это раньше ... не может быть пункта выбора в команде ограничения отбрасывания :) и имена ограничений не согласованы ... Я пытался избежать этих настраиваемых классов рефакторинга, но на самом деле это кажется единственным вариантом ... так что спасибо за подход и +1 и если никто не придумает решение без пользовательских изменений ликвибазы, то это будет мой принятый ответ ..;] - person vrm; 02.09.2010
comment
Я столкнулся с той же проблемой, когда выборки не разрешены в команде ограничения отбрасывания на сервере ms sql. В итоге я сделал следующее, чтобы удалить уникальное ограничение для измерений col в контейнере таблицы bowerstudios.com/node/995 (Ссылка из-за недостаточного количества символов в поле для комментариев). Решение повторяет решение Натана, но настроено для ms sql server. - person Daniel Bower; 28.08.2012

Liquibase предоставляет реализацию для отбрасывания ненулевого ограничения без знания имени ограничения. Возможно, его не существовало, когда был задан этот вопрос (я понимаю, что он довольно старый).

dropNotNullConstraint

<dropNotNullConstraint catalogName="cat"
            columnDataType="int"
            columnName="id"
            schemaName="public"
            tableName="person"/>

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

person David Spence    schedule 15.04.2014

Для HSQL запрос, который предложил Натан, не работает (измените ограничение отбрасывания таблицы TABLE_NAME (выберите unique_index_name из information_schema.constraints, где table_name = 'TABLE_NAME' и column_name = 'SHORT_ID'))

Это потому, что нельзя смешивать DDL и SQL.

Отказ от ограничения, зная имя во время выполнения, кажется невозможным с HSQL (мне это нужно при откатах перед удалением столбцов с ограничениями). Это возможно для Oracle и MSSQL.

Что я делаю, так это получаю сгенерированную базу данных через файлы hbm (спящий режим). Поскольку спящий режим не поддерживает именование уникальных ключевых ограничений, например, например удаление этих столбцов с ограничениями невозможно с помощью Liquibase (для HSQL). У нас есть тесты, основанные на HSQL, тестирующие все это. Было бы неплохо получить решение для HSQL.

На данный момент я просто жестко запрограммировал уникальные имена ограничений (работа)

person anshuiitk    schedule 13.05.2013