2

ant スクリプトに future-rollback タグを追加しました。私がやりたいこと (そして、future-rollback が私が探しているものだと思います) は、SQL ロールバック スクリプトを生成することですが、それを実行することはありません (ロールバック スクリプトは、SQL スクリプトと共に配信する必要があります。クライアントからの要件です)。

私の変更ログ ファイルには多くの変更セットがあり、その中には <sqlFile>タグが含まれているものもあります。

例えば:

<databaseChangeLog ...>

<include file="latest/somesqlprocedure.xml" relativeToChangelogFile="true"/>

</databaseChangelog...>

タグlatest/somesqlprocedure.xmlが付いている場所。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>

Ant スクリプトを実行すると、次のエラーが表示されます。

liquibase.exception.ChangeLogParseException: 無効な移行ファイル: <sqlfile path=${changelog.dir}/latest/myprocedure.sql> - ファイルが見つかりませんでした

誰が何が起こっているのか考えていますか?

これは 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>

前もって感謝します。

4

1 に答える 1

2

問題は、クラスパス相対パスではなく、sqlFile で絶対パスを使用することから発生している可能性があります。クラスパスの相対パスは、もともと liquibase でサポートされていたものであり、さらによくテストされています。絶対パス オプションが最近追加されましたが、futureRollbackSql コードには、それをサポートするためのパッチが適用されていない可能性があります。

相対パスを使用して sqlFile を試すことはできますか?

補足として、どのチェンジセットが実行されたかを記録するためにファイル名が databasechangelog テーブルで使用されるため、一般的には相対パス オプションの方が適しています。絶対パスを使用すると、パス全体が保存され、別のパスから変更ログを再実行しようとすると (または別のマシンから同じデータベースに対して実行すると)、liquibase はそれが別の changeSet であると認識し、再実行します。

于 2010-02-10T21:14:40.760 に答える