Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ant Flyway 2.1.1无法使用Oracle创建版本表_Ant_Flyway - Fatal编程技术网

Ant Flyway 2.1.1无法使用Oracle创建版本表

Ant Flyway 2.1.1无法使用Oracle创建版本表,ant,flyway,Ant,Flyway,我是第一次测试Flyway,版本2.1.1。 我正在使用Ant任务migrate,如果它不存在(并且在我的模式中不存在),那么它应该创建schema\u version表,并且我得到以下错误: C:\Users\dmusiani\Desktop\flyaway-test>ant Buildfile: build.xml migrate-db: [flyway:migrate] com.googlecode.flyway.core.api.FlywayException: Found no

我是第一次测试Flyway,版本2.1.1。 我正在使用Ant任务
migrate
,如果它不存在(并且在我的模式中不存在),那么它应该创建
schema\u version
表,并且我得到以下错误:

C:\Users\dmusiani\Desktop\flyaway-test>ant
Buildfile: build.xml

migrate-db:
[flyway:migrate] com.googlecode.flyway.core.api.FlywayException: Found non-empty
 schema "SYSTEM" without metadata table! Use init() first to initialize the meta
data table.

BUILD FAILED
C:\Users\dmusiani\Desktop\flyaway-test\build.xml:37: Flyway Error: com.googlecod
e.flyway.core.api.FlywayException: Found non-empty schema "SYSTEM" without metad
ata table! Use init() first to initialize the metadata table.

Total time: 0 seconds
C:\Users\dmusiani\Desktop\flyaway-test>
我尝试在迁移之前添加
init
,这是第一次,但当我第二次启动构建时,我从
init
中得到一个错误,表示表已经存在

这是我的蚂蚁目标:

<target name="migrate-db">

    <path id="flyway.lib.path">
        <fileset dir="./lib">
            <include name="**/flyway*.jar"/>
        </fileset>
    </path>

    <path id="flyway.classpath">
        <fileset dir="./lib" includes="ojdbc6-11.2.0.3.jar"/>
    </path>

    <taskdef uri="antlib:com.googlecode.flyway.ant"
             resource="com/googlecode/flyway/ant/antlib.xml"
             classpathref="flyway.lib.path"/>

    <flyway:init  driver="oracle.jdbc.OracleDriver"
                     url="jdbc:oracle:thin:@localhost:1521:WBMD"
                     user="system"
                     password="manager" 
                     initVersion="0"
                     initDescription="Version table initialization (table &quot;USERNAME&quot;.&quot;schema_version&quot; )"/>

    <flyway:migrate driver="oracle.jdbc.driver.OracleDriver"
                     url="jdbc:oracle:thin:@localhost:1521:WBMD"
                     user="system"
                     password="manager"
                     sqlMigrationPrefix="patch" >
        <locations>
            <location path="integrations-runtime/HELIOS/1-9-0/nlip-0-5-0/migration/system"/>
        </locations>
    </flyway:migrate>

</target>


有没有关于如何修复的建议?

您必须为Flyway初始化一次db。此时Flyway将创建用于跟踪迁移的表。正如您所注意到的,再次初始化的任何尝试都会失败,因为表已经存在

我建议创建一个单独的ant任务,您可以手动运行该任务来初始化Flyway,大致如下:

<target name="init-flyway">

    <path id="flyway.lib.path">
        <fileset dir="./lib">
            <include name="**/flyway*.jar"/>
        </fileset>
    </path>

    <path id="flyway.classpath">
        <fileset dir="./lib" includes="ojdbc6-11.2.0.3.jar"/>
    </path>

    <taskdef uri="antlib:com.googlecode.flyway.ant"
             resource="com/googlecode/flyway/ant/antlib.xml"
             classpathref="flyway.lib.path"/>

    <flyway:init  driver="oracle.jdbc.OracleDriver"
                     url="jdbc:oracle:thin:@localhost:1521:WBMD"
                     user="system"
                     password="manager" 
                     initVersion="0"
                     initDescription="Version table initialization (table &quot;USERNAME&quot;.&quot;schema_version&quot; )"/>

</target>

在等待2.2版时,我成功地(对oracle DB)测试了以下初始化Flyway元数据表的“自动”方法:

<target name="flyway.init.check">
    <!-- Select on the DB to see if the metadata table is already in place-->
    <sql driver="oracle.jdbc.OracleDriver"
         url="jdbc:oracle:thin:@localhost:1521:WBMD"
         userid="user"
         password="pwd" 
         print="yes" 
         output="temp.properties"
         expandProperties="true" 
         showheaders="false" 
         showtrailers="false" 
         classpathref="flyway.classpath">
        <![CDATA[
        select 'flyway.metadata.initialized=true' from user_tables where table_name = 'schema_version';
        ]]>
    </sql>
    <!-- load as properies the output from the select -->
    <property file="temp.properties" />
    <delete file="temp.properties" quiet="true"/>
</target>

<target name="flyway.init" depends="flyway.init.check" unless="flyway.metadata.initialized">
    <flyway:init  driver="oracle.jdbc.OracleDriver"
                 url="jdbc:oracle:thin:@localhost:1521:WBMD"
                 user="user"
                 password="pwd" 
                 initVersion="0"
                 initDescription="Version table initialization"/>
</target>

<target name="migrate-db" depends="flyway.init">
   ......
</target>

......
如果您喜欢,请尽情享受(也许使用ant contrib可以获得更简单、更紧凑的解决方案)


Davide

这个答案对于2.1.1是正确的。从2.2开始,您将能够以幂等方式多次调用init。然而,还有另一个问题,那就是在模式系统中创建表。您应该通过更改用户或使用schemas属性显式设置模式,将其更改为其他内容。您好,感谢所有回复。大约2.2我期待它,如果它在重新执行init时改进了行为的话。同时,我将尝试在Ant中以某种方式管理它(我不能采用“手动”方式,因为我必须创建一个自动设置向导……我想我将使用一些sql Ant任务来检查版本表是否已经就绪)。关于系统用户,问题是在我的脚本中我必须创建用户和表空间,以便从头开始创建DB;因此我需要使用SYSTEM。为什么在Flyway文档中,Ant“migrate”任务写为“将架构迁移到最新版本。如果元数据表不存在,Flyway将自动创建它。”?这似乎不是真的,根据我们在这篇文章中所写的。。。还是我遗漏了什么?根据经验,我知道Flyway的早期版本(永远、永远、在任何情况下都不会使用系统用户运行应用程序。只是不要这样做。永远不要在系统帐户中创建自己的对象。使用“正常”创建新用户特权并使用它。停止为您的应用程序使用系统帐户。我只是说我使用系统帐户权限创建其他用户以用于应用程序…不是在其上创建对象,也不是将其用于应用程序。无论如何,我感谢您的警告。感谢创建用户是DBA的工作,而不是“应用程序”的责任而且它绝对不应该包含在模式迁移中。