Restrições de queda de LICIBASE sem saber seu nome
-
26-09-2019 - |
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?
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 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í)