liquibase futuro de erro de reversão com SQLFile tag: Arquivo não encontrado
Pergunta
Eu adicionei a tag futuro-reversão para o meu script ant. O que eu quero fazer (e eu acho que o futuro-rollback é que estou procurando) é gerar um script de reversão sql, mas sem executá-lo ( roteiro de reversão deve ser entregue com scripts SQL é a exigência de meu cliente).
Meu arquivo changelog tem muitos changesets, alguns dos quais contêm a tag <sqlFile>
.
Por exemplo:
<databaseChangeLog ...>
<include file="latest/somesqlprocedure.xml" relativeToChangelogFile="true"/>
</databaseChangelog...>
Quando o latest/somesqlprocedure.xml
tem uma tag sqlFile
.
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.9 http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.9.xsd">
<sqlFile path="${changelog.dir}/latest/myprocedure.sql" splitStatements="false" />
</changeSet>
</databaseChangeLog>
Quando eu executar o script ant, eu recebo o seguinte erro
liquibase.exception.ChangeLogParseException: Arquivo de Migração inválido:
<sqlfile path=${changelog.dir}/latest/myprocedure.sql>
- Não foi possível encontrar o arquivo
Alguém tem uma idéia do que está acontecendo?
Este é um trecho do arquivo build.xml
<target name="db-future-rollback" depends="init">
<rollbackFutureDatabase
changeLogFile="${db.changelog.file}"
driver="${database.driver}"
url="${database.url}"
username="${database.username}"
password="${database.password}"
outputfile="${database.rollback.dir}"
promptOnNonLocalDatabase="${prompt.user.if.not.local.database}"
classpathref="project.classpath"
>
</rollbackFutureDatabase>
</target>
Agradecemos antecipadamente.
Solução
O problema pode estar vindo de usar um caminho absoluto em sua SQLFile, em vez de um caminho classpath-relativa. O caminho relativo classpath foi o que foi originalmente suportado no liquibase e ainda é melhor testado. A opção de caminho absoluto foi adicionado recentemente, eo código futureRollbackSql pode não ter sido corrigido para apoiá-lo.
Você pode tentar a SQLFile usando um caminho relativo?
Como uma nota lateral, a opção de caminho relativo é geralmente melhor porque o nome do arquivo é usado na tabela de databasechangelog a nota que changesets tem ran. Se você usar um caminho absoluto, todo o caminho é armazenado e se você tentar re-executar o changelog de um caminho diferente (ou correndo contra o mesmo banco de dados de uma máquina diferente), liquibase vai pensar que é um conjunto de alterações diferentes e tentar re-executá-lo.