У меня есть экземпляр экземпляра и экземпляр QA, в который я интегрирую Liquibase. Это означает, что DDL и данные уже существуют (или нет, если в блоке разработки). Я должен создать changeLog, который записывает все как RAN на непустых БД, но фактически выполняет их на пустых БД. Я нахожусь на хорошем пути, но я немного застрял в создании внешних ключей. (база данных - это Oracle).Liquibase, создавать внешние ключи в Oracle, предварительные условия
(В общем, я создаю предпосылки, ожидающие, что различные объекты НЕ будут существовать и в случае неудачи MARK_RAN это изменение).
Мне трудно найти правильное условие, когда я не знаю точное имя внешних ключей, которое может или не может существовать. Существует отметка <foreignKeyConstraintExists>
в жидкости (предварительное условие), но требуется только schemaName
и foreignKeyName
атрибутов (и они необходимы). В этих случаях я не знаю имена внешних ключей, поскольку они находятся вне моего контроля.
Вы можете написать пользовательские SQL в предпосылках, как:
<changeSet id="1" author="bob">
<preConditions onFail="WARN">
<sqlCheck expectedResult="0">select count(*) from oldtable</sqlCheck>
</preConditions>
<dropTable tableName="oldtable"/>
</changeSet>
Так что я только должен создать собственный SQL запрос, который можно проверить, если в колонке на столе A
имеет внешний ключ таблицы B
реферирования и использовать результат как предварительное условие. Это где моя проблема в том, что вы можете сделать это в Oracle, но это довольно наворотов:
SELECT a.table_name, a.column_name, a.constraint_name, c.owner,
c.r_owner, c_pk.table_name r_table_name
FROM all_cons_columns a
JOIN all_constraints c ON a.owner = c.owner
AND a.constraint_name = c.constraint_name
JOIN all_constraints c_pk ON c.r_owner = c_pk.owner
AND c.r_constraint_name = c_pk.constraint_name
WHERE c.constraint_type = 'R' AND a.table_name = 'MY_TABLE'
AND a.column_name = 'MY_COLUMN'
AND c_pk.table_name = 'MY_OTHER_TABLE';
Это печатает строку, если внешний ключ существует на MY_COLUMN
из MY_TABLE
, который ссылается на MY_OTHER_TABLE
. После перезаписи в COUNT вы можете проверить, есть ли внешний ключ, не зная его имени.
Мой вопрос: Я десятки иностранных ключей, я действительно должен написать это большие SQL такие десятки раз? Любые предложения, например, аутсорсинг этой функции? Благодаря!
Стоит ли попросить разработчиков Liquibase указать атрибут имени <foreignKeyConstraintExists>
и ввести атрибут таблицы ссылок alogn с локальным именем столбца?
Это хорошая идея, я создал https: //liquibase.jira.com/browse/CORE-1639 –
Действительно с нетерпением жду этого в Liquibase! – gyorgyabraham