2012-06-28 2 views
2

Я только начал использовать Liquibase и напутал проблему, чтобы различать возможности разных баз данных.Как различать базы данных при использовании, например, sequence

Мы хотели бы поддерживать несколько баз данных (Oracle, MySQL, Derby - для обозначения трех).

Все имеют разные возможности. В частности, Oracle поддерживает sequences, тогда как MySQL и Derby этого не делают.

Когда я позволяю hibernate генерировать DDL, я могу выбрать разные диалекты, и он рассмотрит эти различные возможности и сгенерирует Sequencer при использовании Oracle и использует обычную таблицу (для генерации ID) при использовании Derby или MySQL.

Теперь я знаю, что могу ограничить набор изменений, указав «oracle» в атрибуте dbms. Но как я могу сделать решение простой таблицы для других баз данных? Кажется, что для dbms атрибут «нет оракула» не существует.

Как кто-либо еще справляется с этим? (Я не мог найти ничего об этом на страницах ликбезы и на форуме.)

ответ

3

Попробуйте использовать precondition на смену. Булевы операции поддерживаются.

Например

<preConditions onFail="CONTINUE"> 
    <or> 
     <dbms type="oracle" /> 
     <dbms type="mysql" /> 
    </or> 
</preConditions> 
+0

Thx для вашей помощи Mark. Я уже нашел «preConditions», но это означает, что я должен перечислить все базы данных, которые не поддерживают «последовательности». Если Liquibase расширяет список поддерживаемых баз данных (или один поддерживающий non-sequence db поддерживает это в будущей версии), я должен был бы подумать об этом и расширить список. Я надеялся, что решение «нужно снова подумать об этом снова». – Jens

+0

О, может быть, теперь я понимаю, что вы подразумеваете под булевыми операциями: вы можете добавить '' примерно так: ''. – Jens

+0

Да, это было то, что я имел в виду. В любом случае вам придется поддерживать какой-то список. Базы данных, которые поддерживают (или не поддерживают) последовательности. Поистине кросс-платформенная схема не без проблем :-) –

0

Альтернативный подход поставить все последовательности в changlog файл, который вы include в основной список изменений, а затем сделать что-то вроде этого:

<changeSet 
    dbms="oracle,db2,db2i" 
    author="mccallim (generated)" 
    id="1419011907193-1" 
> 
    <createSequence 
     schemaName="${main.schema}" 
... 

этой ревизии только выполняется для перечисленных СУБД.

Смежные вопросы