2013-07-09 9 views
2

Я тестирую Flyway в первый раз, версия 2.1.1. Я использую Ant задачу migrate, которая должна создать schema_version таблицу, если она уже не существует (и не существует в моей схеме), и я получаю эту ошибку:Flyway 2.1.1 не удается создать таблицу версий с Oracle

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 sayng, что таблица уже существует.

Вот мой муравей цель:

<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> 

Любое предложение о том, как это исправить?

+1

*** НИКОГДА *** ни при каких обстоятельствах не запускайте приложение с пользователем SYSTEM. Только не делай этого. И никогда не создавайте свои собственные объекты в учетной записи SYSTEM. Создайте нового пользователя с «нормальными» привилегиями и используйте его. Прекратите использование учетной записи SYSTEM для вашего приложения. –

+0

Я только сказал, что я использую право системной учетной записи для создания других пользователей для использования в приложении ... не создавать объекты на нем и не использовать его для приложения. В любом случае, я ценю ваше предупреждение. Спасибо – Damus

+0

Создание пользователей - это работа DBA, а не ответственность «приложения», и это определенно не то, что должно быть включено в миграцию схемы. –

ответ

0

Вам необходимо инициализировать db один раз для Flyway. То есть, когда Flyway создает таблицу, используемую для отслеживания миграции. Как вы заметили, любая попытка инициализации снова не выполняется, потому что таблица уже существует.

Я предлагаю сделать отдельный муравей задачу, которая вызывает Flyway's init, который можно запустить вручную инициализировать пролетный путь, что-то вдоль линий:

<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> 
+0

Этот ответ верен для 2.1.1. Вы можете вызвать init несколько раз идемпотентно с 2.2. Однако есть еще одна проблема, и это то, что таблица создается в схеме SYSTEM. Вы должны изменить его на что-то другое, либо изменив пользователя, либо явно установив схему, используя свойство schemas. –

+0

Привет, спасибо всем за ответы. Около 2.2. Я с нетерпением жду этого, если он улучшит поведение при повторном запуске init. Тем временем я попытаюсь каким-то образом справиться с этим в Ant (я не могу пойти «вручную», так как мне нужно создать мастер автоматической настройки ... Я думаю, что я буду использовать некоторую задачу sql ant, чтобы проверить, не установлена ​​ли таблица версий). Что касается пользователя SYSTEM, дело в том, что в моих сценариях я должен создавать пользователей и табличные пространства, чтобы создать БД с нуля; поэтому мне нужно использовать SYSTEM. – Damus

+0

Почему в Flyway docs задача Ant «migrate» написана «Перенастройка схемы в последнюю версию.» Flyway автоматически создаст таблицу метаданных, если она не существует. »?? Кажется, это не правда, согласно тому, что мы написали в этом посте ... или я что-то упускаю? – Damus

1

В ожидании 2.2, я успешно протестировали (к БД Oracle) следующий «автоматический» способ инициализации пролетный путь метаданных таблицы:

<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> 

Enjoy, если вам это нравится (возможно, с помощью муравьев-вно вы могли бы получить более простое и компактное решение)

Davide