2010-09-01 20 views
6

Utilizamos Liquibase hacer un seguimiento de los cambios de base de datos .. primer conjunto de cambios contiene estas líneas:Liquibase caer restricción sin conocer su nombre

<column name="SHORT_ID" type="INTEGER"> 
    <constraints unique="true" /> 
</column> 

Básicamente esto significa que la columna SHORT_ID tiene restricción única, pero el nombre de este la restricción puede ser cualquiera y generalmente es diferente cada vez (ejecutamos algunas pruebas de integración contra bases de datos H2 y se hacen nuevas bases cada vez que ejecutamos pruebas)

Así que ... el problema es: no puedo cambiar este primer changeSet pero ahora tenemos que deshacernos de esta restricción única. ¿Alguna idea de cómo lograr eso mediante el uso de liquibase?

Respuesta

3

El SQL de H2 para eliminar restricciones requiere un nombre de restricción. No recuerdo si el nombre de la restricción generada automáticamente en H2 es aleatorio o sería coherente en las bases de datos.

Si es constante, puede usar la etiqueta normal de liquibase y funcionará bien.

Si es aleatorio, tendrá que obtener el nombre de la restricción del information_schema. H2 puede permitir algo así como:

alter table TABLE_NAME drop constraint 
     (select unique_index_name 
       from information_schema.constraints 
       where table_name='TABLE_NAME' and column_name='SHORT_ID') 

Si no es así, puede que tenga que crear una costumbre Liquibase cambio (http://liquibase.org/extensions con 2,0, http://www.liquibase.org/manual/custom_refactoring_class en 1.9) que hace la llamada y deja caer la restricción.

+1

Intenté esto antes ... no puedo tener una cláusula de selección en el comando de restricción de caída :) y los nombres de restricción no son consistentes .. Intenté evitar esas clases de refactorización personalizadas pero realmente parece ser la única opción ... así que gracias por acercarse y +1 y si a nadie se le ocurre una solución sin cambios personalizados de liquibase, esta será mi respuesta aceptada.;] – vrm

+1

Me encontré con el mismo problema con select no está permitido en el comando de restricción de caída en el servidor ms sql. Terminé haciendo lo siguiente para eliminar una restricción única para las medidas de una columna en el contenedor de la tabla https://bowerstudios.com/node/995 (Enlace porque no hay suficientes caracteres en el cuadro de comentarios). La solución se hace eco de Nathan, pero está modificada para el servidor ms sql. –

1

Para HSQL la consulta que Nathan sugiere que no funciona (alter table TABLE_NAME gota restricción (seleccionar unique_index_name de information_schema.constraints donde nombre_tabla = 'TABLE_NAME' y nombre_columna = 'SHORT_ID'))

Este es porque los DDL y los SQL no se pueden mezclar.

Caída de la restricción al conocer el nombre en tiempo de ejecución no parece ser posible con HSQL (lo necesito en retrocesos antes de colocar columnas con restricciones). Esto es posible para Oracle y MSSQL.

Lo que hago es obtener un databse generado a través de archivos hbm (hibernar). Como hibernación no admite el nombramiento de restricciones de clave únicas, por ejemplo, para p. no es posible eliminar estas columnas con restricciones utilizando liquibase (para HSQL). Tenemos pruebas basadas en HSQL probando todo el material. Sería bueno obtener una solución para HSQL.

Por ahora, sólo difícil de código los nombres de restricción únicos (un trabajo alrededor)

2

Liquibase proporciona una implementación para eliminar una restricción no nula y sin saber el nombre de restricción. Puede que no haya existido cuando se hizo esta pregunta (me doy cuenta de que es bastante antigua).

dropNotNullConstraint

<dropNotNullConstraint catalogName="cat" 
      columnDataType="int" 
      columnName="id" 
      schemaName="public" 
      tableName="person"/> 

Un dropUniqueConstraint existe, pero es probable que ya lo sabían, ya que requiere el nombre de restricción.

Cuestiones relacionadas