Проблема заключалась в том, что переименованный столбец был частью ограничения внешнего ключа.
Решение заключается в том, чтобы сначала удалить ограничение, а затем добавить его снова с новым именем столбца. Но если все эти операции выполняются в том же наборе изменений, результат не отличается. Поэтому его нужно разбить на два набора изменений: сначала сбросить ограничение и переименовать столбец, а затем воссоздать ограничение внешнего ключа.
<changeSet author="me" id="renameaTob">
<dropForeignKeyConstraint baseTableName="aTable" constraintName="a_c_fk2"/>
<renameColumn newColumnName="b" oldColumnName="a" columnDataType="BIGINT(19)" tableName="aTable" />
</changeSet>
<changeSet author="me" id="addFkAgain">
<addForeignKeyConstraint baseColumnNames="b"
baseTableName="aTable" constraintName="b_c_fk2"
deferrable="false" initiallyDeferred="false" onDelete="NO ACTION"
onUpdate="NO ACTION" referencedColumnNames="c" referencedTableName="refTable" />
</changeSet>
Я думаю, что также можно использовать только один набор изменений и добавить runInTransaction='false'
, но это не очень хорошая идея.
Я бы порекомендовал сделать изменения как 3 отдельных changeSets. Те же изменения сделаны, но поскольку Liquibase будет отслеживать каждый отдельно, вы не сталкиваетесь с проблемой, если первая половина changeSet проходит (dropForeignKey), а вторая не выполняется (renameColumn). Если это произойдет, то в следующем обновлении Liquibase все равно попытается запустить dropForeignKeyConstraint, но сбой произойдет с ошибкой OBJECT NOT EXISTS. –
RunInTransaction не будет влиять на эти конкретные changeSets, потому что все утверждения автоматически фиксируются в большинстве баз данных. Основное использование для runInTransaction = false - для баз данных, которые не позволяют операторам DDL в транзакции. –