Atualização de Banco de Dados
05/11/2012 17:35
0
Pessoal,

Tenho uma dúvida que me persegue há tempo no Grails.

Tenho um domínio:

class A{

String nome

...

static constraints = {

nome nullable: false, blank: false

...
}


}

Quando mandamos o Grails rodar o hibernate cria regras de campo obrigatório para o 'nome'.

Porém com as manutenções e remodelagens do sistema caso exista a necessidade de efetuar uma alteração e colocar o campo que se chamava 'nome' renomeando para 'nomeFuncionario' ou alterar a constraint de nullable:false para nullable:true. Fazendo qualquer uma destas alterações, ao tentar inserirmos dados na tabela ocorre erro de inserção uma vez que o antigo campo 'nome' está presente ou suas regras de obrigatoriedade.

O hibernate não efetua a exclusão das antigas regras o que obriga o desenvolvedor a ir diretamente no BD e excluir a tabela uma vez que excluindo apenas a coluna o problema persiste e ao excluir a tabela e reiniciar a aplicação o banco é modelado nas configurações desejadas.

o problema ocorre quando a aplicação encontra-se em produção e o desenvolvedor tem que migrar uma tabela de dados a cada alteração no domínio.

Minha dúvida é, alguém que passa ou já passou por isso conhece algum meio melhor de persistir os dados quando ocorre este tipo de alteração em Domínios sem excluir a tabela Diretamente no banco de Dados?
Tags: hibernate, banco de dados


1
Fala Brother! Dá uma olhada em Migrations... o Grails tem um plugin muito bom pra isso! LINK



1
o database migration tem várias funcionalidades, acho que engloba isso

http://grails.org/plugin/database-migration
05/11/2012 17:42


0
Ola Gabriel e Mussatto, muito obrigado pela dica. Estudei a noite inteira sobre este plugin e parece que ele realmente efetua as alterações de dominio no Banco de Dados.

A documentação do plugin é muito pobre sem explicar maiores detalhes. O que entendi é que o plugin gera um modelo do Banco de dados e a cada alteração de dominio são registradas e posteriormente atualizadas no banco e dados.

(1) O que não entendi direito é se no banco de dados de produção tais alterações registradas pelo plugin são automaticamente atualizadas na subida da aplicação? Se devo fazer alguma configuração extra para migrar o banco de dados de produção uma vez que o mesmo não possui o 'dbCreate'?

(2) Após criado o banco de dados de produção eu realmente tenho que retirar o dbCreate = "update" do DataSource.groovy
. Alguns exemplos que li retirava somente do Desenvolvimento e outro do desenvolvimento e da produção. O que realmente fazer?
06/11/2012 12:21


2
Fala Brother!

É isso mesmo vc retira o dbCreate pq quem vai cuidar da criação do banco e atualização se necessário vai ser o plugin! Ele possui um sistema de versionamento do banco! então quando vc altera no changelog e altera a versão! Ele vai alterar a estrutura do banco

Este plugin é baseado no Liquibase, então o que precisar pode buscar na documentação do Liquibase... lá os exemplos estão em XML aí só abstrair pro jeito grooviano! :D

Espero que não tenha ficado muito confuso! Abraços!


2
Opa! esqueci de postar o LINK do Liquibase! foi mals! :)


0
E ai gabriel,

eu queria entender melhor o plugin e ainda tenho essa dúvidas:

(1) Com o tempo é comum termos muitas modificações. Tem algum problema se com o tempo quando ocorrer umas 20 'diff' a serem implementadas no banco refazer o changelog.groovy e começar uma nova listagem de alterações? Isso é uma boa estratégia?

(2) todas as vezes que eu refizer o changelog.groovy eu tenho que sincronizar com a aplicação (grails dbm-changelog-sync) ? Eu tenho que executar este comando todas as vezes que fizer o update das alterações no BD? Para ser sincero eu não entendi direito o que este comando efetua na aplicação.
06/11/2012 15:14


0
Fala Brother,

Na empresa onde trabalho alteramos o changelog na mão toda vez que precisar de editar a estrutura do banco, pq o plugin cria uns nomes para sequencias e indices que não estão dentro do padrão criado pela empresa!
Toda alteração que precisar fazer vai ficar dentro de um changeSet que possuirá um autor e um id, esse id é usado pelo plugin para identificar as alterações que ele buscará(Isso falando a grosso modo).

Ex:
changeSet(author: "fulano de tal", id: "0000000000-1") {
column(name: "id_usuario", type: "INT") {
constraints(nullable: "false")
}
}


Toda vez que edito o changeLog, apenas reinicio a aplicação!


0
E ai Gabriel,

interessante essa discussão. Também não conhecia esse plugin apesar de ser famoso.

O indice e nomes sequenciais usado no changelog não é o mesmo usado no banco de dados criado pelo Grails?

Poderia dar um exemplo, apenas para curiosidade mesmo, do que o plugin cria que você considera fora do padrão?

Grande abraço a todos.
08/11/2012 14:35


0
Fala Brother!

Quando o plugin gera os nomes, por exemplo de uma chave estrangeira, ele cria seguindo a nomenclatura do plugin, porém, quando falei que não está no padrão! me referia aos padrões de nomenclatura que usamos aqui na empresa onde trabalho, isso é pra facilitar a comunicação entre os desenvolvedores e suporte.

Abraço!


0
Gabriel,

me deparei com um dilema. Tinha um campo com constraint 'UNIQUE:TRUE' e mandei retirar a constraint. Mandei gerar uma diff e porém no arquivo ele não consegue encontrar a alteração onde exclui a clausula unique da constraint. Nem mesmo eu colocando UNIQUE: FALSE ele encontra a alteração.

Dai vi que no meu arquivo changelog.groovy encontrei a foreingkey da contraint adicionando unique ao campo:

changeSet(author: "ivgsilva (generated)", id: "1352204468083-40") {
addUniqueConstraint(columnNames: "processo", constraintName: "dominio_processo_key", deferrable: "false", disabled: "false", initiallyDeferred: "false", tableName: "dominio")
}


Procurei na documentação do liquibase algum comando como 'removeUniqueConstraint' para adicionar em uma diff porém não encontrei.

Estou pensando em excluir fisicamente essa chamada do changelog.groovy, porém não se se será uma boa. O que vc me recomenda? O que fazer para permitir que este campo não seja mais UNIQUE usando o plugin.
08/11/2012 18:41


1
Fala Brother!! Tenta fazer o seguinte!

dropUniqueConstraint(tableName:"sua_tabela" constraintName:"seu_constraint")


Abraço!


1
Opa! corrigindo, faltou uma vírgula!

dropUniqueConstraint(tableName:"sua_tabela", constraintName:"seu_constraint")


1
Gabriel,

problema resolvido!

Esse comando funcionou perfeitamente.

Muito obrigado pela sua ajuda!

Valeu mesmo.

Abraço.
09/11/2012 11:38


0
Opa! Que bom que resolveu! Estamos as ordens Brother! Abraço!


0
Gabriel,

só surgiu um problema quando eu fui migrar a alteração do database migration para produção. No desenvolvimento eu gerei as implementações normalmente e mandei atualizar com o comando 'dbm-update' e no banco de desenvolvimento persistiu normalmente porém na geração do WAR encaminhei para minha produção e as alterações não foram persistidas quando reiniciei o servidor.

Você saberia me dizer o que mais eu tenho que fazer para persistir as alterações em minha produção?
09/11/2012 16:06


0
Só lembrando que eu exclui o dbCrete="update" de todas as minhas máquinas do meu DataSource.groovy.
09/11/2012 16:16


0
Fala Brother!

Brother! eu ñ passei por isso! mas dei uma pesquisada! se liga nesse LINK vê se ajuda! E se já conseguiu uma solução! posta aqui para nós!

Abração!



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto