2012-06-06 28 views
6

Estoy tratando de ejecutar el siguiente changeSet en liquibase que debería crear un índice. Si el índice no existe, debería fallar silenciosamente:Liquibase changeSet con failOnError = "false" siempre se ejecutan?

<changeSet failOnError="false" author="sys" id="1"> 
    <createIndex unique="true" indexName="key1" tableName="Table1"> 
     <column name="name" /> 
    </createIndex> 
</changeSet> 

Hasta ahora, muy bien. El problema es que este changeSet no se registra en la tabla DATABASECHANGELOG y por lo tanto se ejecuta cada vez que se ejecuta liquibase. De acuerdo con la documentación de liquibase y p. this answer de Nathen Voxland pensé que el conjunto de cambios debería marcarse como ejecutado en la tabla DATABASECHANGELOG. En cambio, no se registra y como dije antes, se ejecuta cada vez que se ejecuta licibase (y falla cada vez más).

¿Echo de falta algo?

(estoy usando MySQL como DBMS)

Respuesta

3

En el answer dada por Nathen Voxland, recomendó el enfoque más correcto de utilizar un precondition para comprobar el estado de la base de datos, antes de ejecutar el conjunto de cambios.

Me parece que ignorar un error es una mala idea .... Significa que no controla completamente la configuración de la base de datos .... El parámetro "failOnError" permite que liquibase continúe. ¿No sería una mala idea que una construcción grabe un changset como ejecutado, si de hecho no lo hizo porque ocurrió un error?

+0

Estoy totalmente de acuerdo con usted, usar una condición previa es el enfoque correcto en mi opinión también. Después de todo, eso es lo que hice con mi 'changeSet' (aunque falta la precondición de uniqueConstraintExists, pero ese es otro hecho). Acabo de tropezar con mis expectativas del atributo 'failOnError =" false "' y me pregunté si el comportamiento descrito es un error o una característica;) – ebi

+1

Lamentablemente, una condición previa para Oracle no nulo no funciona para mí porque la comprobación de una columna que no admite nulos no es compatible con liquibase. –

+0

Estoy publicando esto en nombre de [dev-null] (https://stackoverflow.com/users/1436741/dev-null) que ha publicado este comentario como respuesta; _Esto se relaciona con el comentario de st_jeff en la respuesta anterior (pero no tengo ninguna reputación para hacer un comentario): Otro caso de uso para failOnError: Si suelta una restricción única en el oráculo, entonces el índice relacionado solo se cae si es más nuevo que la restricción. Entonces, una declaración de índice de caída después de eliminar la restricción puede generar un error o no, dependiendo de la antigüedad del índice._ – Bugs

Cuestiones relacionadas