Обработка переменных подстановки sqlplus (&& vars) в Liquibase - PullRequest
0 голосов
/ 25 октября 2018

мой проект пытается перейти на liquibase, но отсутствие поддержки переменных связывания делает это трудным.

Во время нашего развертывания у нас есть сценарии sql, содержащие переменные подстановки sqlplus, например,

-- load_seed.sql ---
insert into <table>
values('&&host', '&&port', '&&user');

Значения этих переменных различаются в зависимости от среды, поэтому мы определяем такие профили.

<DEV_profile.sql>
DEFINE host='dev.company.org'
DEFINE port=4008
..

<UAT_profile.sql>
DEFINE host='uat.company.org'
...

и мы запускаем развертывание следующим образом:

./deploy.ksh DEV

---- deploy.ksh ---
sqlplus <<END
<connection>
@$1_profile
@load_seed

во время выполнения выбирается правильный профиль и заменяются переменные.

Не могли бы вы подсказать, как обрабатывать такой случай с помощью Liquibase?

1 Ответ

0 голосов
/ 25 октября 2018

Эквивалентная функциональность в Liquibase обеспечивается параметрами журнала изменений .

В вашем журнале изменений вы определяете параметры, которые в основном являются парами ключ-значение, а liquibase решает, какое значение использовать на основена значение context или label или dbms.

Если вы хотите применить набор изменений к определенной среде, вы указываете context или label в командной строке или в liquibase.properties.Liquibase может определить dbms на основании URL-адреса соединения.

Вот пример, который несколько похож на то, что вы описываете:

<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd
        http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">

    <property name="host" value="dev.company.org" context="DEV"/>
    <property name="port" value="4008" context="DEV"/>
    <property name="user" value="DEV_USER" context="DEV"/>

    <property name="host" value="uat.company.org" context="UAT"/>
    <property name="port" value="4321" context="UAT"/>
    <property name="user" value="UAT_USER" context="UAT"/>

    <changeSet id="1" author="joe">
      <insert tableName="someTableName">
        <column name="host" type="varchar(255)" value="${host}"/>
        <column name="port" type="varchar(8)" value="${port}"/>
        <column name="user" type="varchar(255)" value="${user}"/>
      </insert>    
    </changeSet>
</databaseChangeLog>
...