Pergunta

Usamos o LIFIBASE para acompanhar as alterações do banco de dados. Primeiro alterações contém essas linhas:

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

Basicamente, isso significa que a coluna Short_ID tem restrição única, mas o nome dessa restrição pode ser o que for e geralmente é diferente a cada vez (executamos alguns testes de integração contra bancos de dados H2 e novas bases são feitas cada vez que executamos testes)

Então .. o problema é: não posso mudar essa primeira troca, mas agora precisamos nos livrar dessa restrição única. Alguma idéia de como conseguir isso usando o LIFIBASE?

Foi útil?

Solução

O SQL do H2 para queda de restrições requer um nome de restrição. Não me lembro se o nome de restrição gerado automaticamente no H2 é aleatório ou seria consistente entre os bancos de dados.

Se for constante, você pode usar a tag liquibase normal e funcionará bem.

Se for aleatório, você terá que obter o nome de restrição do Information_schema. H2 pode permitir algo 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')

Caso contrário, pode ser necessário criar uma alteração personalizada do LIFLIBASE (http://liquibase.org/extensions com 2.0, http://www.liquibase.org/manual/custom_refactoring_class em 1.9) isso faz a chamada e diminui a restrição.

Outras dicas

O Liquibase fornece uma implementação para soltar uma restrição não nula sem conhecer o nome de restrição. Pode não ter existido quando essa pergunta foi feita (percebo que é bastante antiga).

DropNotNullConstraint

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

UMA DropuniqueConstrain Existe, mas você provavelmente já sabia disso, pois requer o nome de restrição.

Para o HSQL, a consulta que Nathan sugeriu não funciona (altere a tabela Table_name Drop Restrint (selecione Única_index_name em Information_schema.Constraints WHERE TABLE_NAME = 'TABLE_NAME' e column_name = 'Short_id')))

Isso ocorre porque os DDLs e SQLs não podem ser misturados.

A restrição de queda ao saber que o nome no tempo de execução não parece ser possível com o HSQL (eu preciso disso em reversão antes de soltar colunas com restrições). Isso é possível para Oracle e MSSQL.

O que eu faço é obter um banco de dados gerado por meio de arquivos HBM (Hibernate). Como o hibernato não suporta a nomeação de restrições principais, portanto, por exemplo, a queda dessas colunas com restrições não é possível usando o LILIBASE (para HSQL). Temos testes com base nos testes de HSQL. Seria bom obter uma solução para o HSQL.

Por enquanto, eu apenas codificamos os nomes de restrições exclusivos (um trabalho por aí)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top