Как динамически передавать значение свойства в тег sql в журнале изменений liquibase

#sql #xml #oracle #liquibase

Вопрос:

В настоящее время я присваиваю предопределенное значение свойства некоторым атрибутам тега, но я также хочу использовать его внутри xml-тегов. Ниже приведен пример, основанный на документации Liquibase:

 <?xml version="1.0" encoding="utf-8"?>
<databaseChangeLog
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd"
>

    <property  name="schema.name"  value="DBPECG"/>

    <changeSet id="20201005103200-1" author="felipe.rudolfe" objectQuotingStrategy="QUOTE_ALL_OBJECTS">
        <createTable schemaName="${schema.name}" tableName="TB_IES" >
         .
         .
         .
        </createTable>
    </changeSet>
</databaseChangeLog>
 

И вот что я хочу сделать. Я хочу использовать schema.name таким образом, внутри тега sql:

 <changeSet id="20201005103200-3" author="felipe.rudolfe" objectQuotingStrategy="LEGACY">
    <sql>
        ALTER TABLE ${schema.name}.TB_IES ADD CONSTRAINT...
    </sql>
</changeSet>
 

Есть ли способ сделать это?

Комментарии:

1. XML обычно имеет корневой элемент, который окружает теги; однако в вашем примере у вас есть property тег и changeSet тег в корне. Вы дали полную структуру? Или есть окружающий корневой тег?

2. Да, есть, я собираюсь это исправить. Спасибо за совет

Ответ №1:

Liquibase позволяет динамическую замену свойств в файлах журнала изменений. Мы можем настроить несколько свойств внутри файла, а затем использовать их везде, где это необходимо. В вашем случае мы можем просто настроить свойство "schemaName" с некоторым значением, а затем использовать его в файле журнала изменений с использованием ${schemaName} синтаксиса.

Liquibase назначает или определяет приоритет значения для настроенного свойства в следующем порядке:

  1. В качестве атрибута, переданного вашему бегуну по ликвидной базе.
  2. Как свойство системы JVM
  3. В качестве переменной среды
  4. В качестве атрибута CLI, если вы запускаете liquibase через командную строку
  5. В файле liquibase.properties
  6. В блоке параметры (элемент свойства таблицы DATABASECHANGELOG)

Вы можете сделать это, как показано ниже, пример фрагмента кода:

 <?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
                      http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">

    <changeSet author="author" id="some-unique-id" context="some-context">
        **Your SQL query/ transactional logic goes here**
        <sql>
             ALTER TABLE ${schemaName}.TB_IES ADD CONSTRAINT...
        </sql>
    </changeSet>
    
</databaseChangeLog>
 

В liquibase.properties файле я настрою это свойство следующим образом:

 schemaName=DBPECG
 

Примечание: приведенный выше пример использует свойство 1 (имя схемы). Вы можете использовать только еще больше.

Если вам нужна помощь в создании "liquibase.properties" файла, перейдите по этой ссылке

Ваше здоровье!