Fórum [OT] Discussão sobre atualização de base de dados #317674
29/03/2006
0
Posso abrir uma discussão?
Como vocês fazem atualização da base de dados quando há inclusão de novas tabelas, campos, triggers e etc?
[list:4b845ee1d9]
[*:4b845ee1d9] Via script SQL?
[*:4b845ee1d9] Software + Script?
[*:4b845ee1d9] Outros métodos.
[/list:u:4b845ee1d9]
Não quero abrir uma enquete. Aqui na empresa não temos isso, gostaria de criar uma rotina automática, mas o problema maior é: E se existirem usuários conectados a base??? E outros fatores que podem contribuir para ocasionarem erros na atualização de base.
Valeu
Obs. A base que usamos é Firebird, mas poderíamos usar isso para outras bases também.
Adriano Santos
Curtir tópico
+ 0Posts
29/03/2006
Luciano.sul
Espero ter ficado claro...
Até mais
Luciano Ramos
Gostei + 0
29/03/2006
Adriano Santos
Em outra empresa que trabalhei havia uma unit que fazia a atualização automática. Eram uma série de procedures referentes a cada atualização do sistema por exemplo:
procedure AtualizaVersao_1001; begin with MeuCompQuery do begin Close; UnPrepare; Sql.Clear; Sql.Add(´ALTER TABLE MINHA_TABELA ADD COLUMN NOVO_CAMPO VARCHAR(100) NOT NULL´); Try ExecSql; Except end; end; end; procedure AtualizaVersao_1002; begin with MeuCompQuery do begin Close; UnPrepare; Sql.Clear; Sql.Add(´ALTER TABLE MINHA_TABELA ADD COLUMN NOVO_CAMPO VARCHAR(50) NOT NULL´); Try ExecSql; Except end; end; end; procedure AtualizaVersao_1003; begin with MeuCompQuery do begin Close; UnPrepare; Sql.Clear; Sql.Add(´ALTER TABLE MINHA_TABELA ADD COLUMN NOVO_CAMPO VARCHAR(100) NOT NULL´); Try ExecSql; Except end; end; end;
Depois em uma outra procedure faziamos a verificação da versão do banco:
procedure DisparaAtualizacoes; var Versao: String; begin with MinhaQuery do begin Close; UnPrepare; Sql.Clear; Sql.Add(´SELECT VERSAO FROM TABELA_CONFIG WHERE PARAMETRO=:PARAMETRO´); ParamByName(´PARAMETRO´).AsString := ´VERSAO´; Versao := FieldByName(´VERSAO´).AsString; Close; end; if VersaoSoftware = Versao then for I := 0 to 2 do begin case I of 0: AtualizaVersao_1001; 1: AtualizaVersao_1002; 2: AtualizaVersao_1003; end; end; end;
Daí no onShow desta Unit disparávamos a procudure:
procedure TAtualizaBancoShow()........ begin DisparaAtualizacoes; end;
[b:3b26aca962]VersaoSoftware[/b:3b26aca962] era uma variável global no código fonte e que mudávamos cada vez que saia uma nova versão.
Bem, isso é bem feio, eu acho, quando entrei na empresa já era assim. Mesmo sendo feio funionava, mas se houvesse alguém conectado na base dava erro ou a tabela em questão não era atualizada, mas não mostrava o erro porque o except estava sempre vazio:
Try ExecSql; Except end;
Bom, vamos fazer umas mudanças no software que estou trabalhando nesta nova empresa, então não quero ter que fazer um algoritimo como o de cima.
Vlw...ufa, tô sendo detalhista né?
Gostei + 0
29/03/2006
Luciano.sul
No meu caso o cliente sai do sistema para atualizar a base..., acho que disto eu nao vou conseguir fugir...
Até mais.
Luciano Ramos
Gostei + 0
29/03/2006
Adriano Santos
Como eu falei, funciona, porém acho uma idéia chucra. Eu tentaria ao máximo reduzir o algoritimo pra ficar mais simples.
Dá pra fugir sim [b:56dd42bde3]Luciano[/b:56dd42bde3], como disse, o sistema compara a versão (presente no código fonte) com a versão que está no banco e então dispara as atualizações. Funciona que é uma beleza, mas tem o fato que mencionei.
Imagina vc incluir um novo campo na tabela Clientes, entretanto uma porrada de gente tah conectado na tabela. Não funciona. Ai vc tem que mandar todo mundo sair do sistema.
Tô pesquisando no fórum Interbase/Firebird pra ver se acho alguma discussão a respeito. O que estou pensando em fazer é algo mais complexo.
[list:56dd42bde3]
[*:56dd42bde3] Compara versões.
[*:56dd42bde3] Verfica se existem ususários conectados ao banco.
[*:56dd42bde3] Se existirem, mostra uma tela com os caras e com opção para enviar mensagem a todos os usuários avisando que o sistema será atualizado e portanto os mesmo serão desconctados.
[*:56dd42bde3] Desconecta todo mundo.
[*:56dd42bde3] Dispara atualizações.
[*:56dd42bde3] Avisa todo mundo pra voltar a usar o sistema.
[/list:u:56dd42bde3]
Sonho né? Mas se bem projetado, fica legal.
Tah certo que se migrarmos mesmo para DBExpress aqui, não teremos este problema de ´nego´ conectado no banco, pois mudaremos a engenharia do sistema.
É isso, agradeceria se outros colegas postassem suas opniões.
Vlw
Gostei + 0
29/03/2006
Michael
O programa verifica se a versão do banco é a esperada para a atualização, e a aplicação principal só roda se o banco estiver na versão correta.
Quanto aos usuários conectados, o processo é realizado geralmente em um horário de pouca utilização, o que não compromete a tarefa. E se for necessário algo rápido, então todos desconectam manualmente. Não acho legal fechar o programa automaticamente pois algum usuário pode estar fazendo algo importante e ele teria seu trabalho perdido.
É simples e funciona até hoje. ;-)
[]´s
Gostei + 0
29/03/2006
Adriano Santos
Então, neste caso eu daria um tempo pra ele fechar. Tipo, após o recebimento da mensagem o programa ainda iria esperar um tempo. Mas sei lá, coisas automáticas demais acabam resultando em problemas. Concordo contigo.
Vlw
Gostei + 0
29/03/2006
Weber
Banco FireBird
Pego um banco de dados 100¬ atualizado, o que eu chamo de Default, carrego tabela por tabela, campo por campo, trigger por trigger do banco Default e comparo com o banco a ser atualizado, quando há diferenças a rotina faz a atualização.
Deu o maior trabalhão pra montar e a rotina ficou super lenta, mas como o cliente estava pagando :lol:
Tive que fazer diversas verificações:
- Campo não existe: Criar o Campo
- Campo existe mas não é chave: Transformar em chave, mas antes ver se não há informações que possam corromper o banco.
- Campo existe mas é de tipo diferente: Verificar possibilidade de migrar as informações
- Além de mais umas dezenas de verificações.
Com as triggers, views, excepts moleza, sempre mato tudo depois crio de novo.
Infelizmente não posso divulgar o código fonte, seria antiético
Gostei + 0
29/03/2006
Adriano Santos
Tranquilo [b:5570f77e9c]weber[/b:5570f77e9c] essa não é a idéia, o que quero realmente é apenas discutir a respeito pra buscar um parâmetro, assim eu consigo pensar na melhor ou mais rápida forma de fazê-lo.
Vlw
Gostei + 0
29/03/2006
Luciano.sul
Mas mesmo fazendo assim eu achei bem legal o modo de procedures, pois ai eu tiro o trabalho do cliente em abrir um outro programa para atualizar o banco. Simplemente o cliente só tera o trabalho de mudar o executavel.
É isso ai..., é muito bom trocar ideias.
Luciano Ramos
Gostei + 0
29/03/2006
Adriano Santos
[b:4959d19405]Luciano[/b:4959d19405], a única coisa que achei ruim na realidade, embora funcione, é que tem que ficar bem atento quanto mexer na unit de atualização, ou seja:
[list:4959d19405]
[*:4959d19405] Criar uma nova procedure para incluir o script de atualização.
[*:4959d19405] Alterar o ´index´ do FOR de [b:4959d19405][color=blue:4959d19405]for I := 0 to 2 do...[/color:4959d19405][/b:4959d19405] para [b:4959d19405][color=red:4959d19405]for I := 0 to 9 do...[/color:4959d19405][/b:4959d19405] por exemplo.
[*:4959d19405] Incluir a chamada para a nova procedure.
[/list:u:4959d19405]
Até ai beleza, mas conforme as versões vão sendo lançadas o nosso For vai aumentando. Depois de um tempo, acho que fica ruim para dar manutenção em equipe, entende?
if VersaoSoftware = Versao then for I := 0 to 9 do begin case I of 00: AtualizaVersao_1001; 01: AtualizaVersao_1002; 02: AtualizaVersao_1003; 04: AtualizaVersao_1004; 05: AtualizaVersao_1005; 06: AtualizaVersao_1006; 07: AtualizaVersao_1007; 08: AtualizaVersao_1007; 09: AtualizaVersao_1008; 10: AtualizaVersao_1010; end; end;
10 versões diferentes já ficariam assim, imaginem 2, 3 anos de vida do software? Por isso abri a discussão, pra ter uma idéia de como o mercado costuma fazer.
Gostei + 0
29/03/2006
Michael
Acho isso importante pois se a aplicação usar a tabela A, e ela não existir no banco de dados, um erro pode ocorrer durante sua execução.
Quem atualiza o banco de dados e os demais arquivos aqui na empresa é a equipe de infra-estrutura, e não o cliente. E, mesmo que fosse, o nosso programa de atualização é extremamente fácil de se usar. Basta abrí-lo e pronto. ;-)
[b:3eef350abb]Adriano[/b:3eef350abb], esse é outra vantagem de se usar patches: podem haver centenas deles, por exemplo. Cada arquivo funciona independente do outro. Basta criá-lo e configurar o programa de atualização.
[]´s
Gostei + 0
29/03/2006
Massuda
Gostei + 0
29/03/2006
Adriano Santos
Eu entendi [b:b3c787a6cc]Michael[/b:b3c787a6cc], é que, infelizmente, a empresa que trabalho atualmente é pequena e não temos uma equipe de infra-estrutura e o suporte é feito por um cara somente e nem sempre ele está na empresa, pois visita clientes o tempo todo também.
Nosso sistema é voltado ao mercado de transportes, ou seja, atende transportadoras de todo porte. A grande maioria de usuários que utilizam o sistema são pessoas com nível de conhecimento bem baixo, e as vezes o simples abrir o site, baixar o programa, encontrar o arquivo no hd e abrir, vixi tem vezes que se torna inviável. Temos que mandar o suporte ir ao local, manja?
Por isso quero criar algo o mais simples possível. Não estou dizendo que a sua idéia não me convenceu, muito pelo contrário, apenas estou averiguando o que eu posso fazer de mais tranquilo possível para o usuário final.
Vlw véio.
Gostei + 0
30/03/2006
Titanius
Entrando no assunto,
Hoje faço a mesma coisa que foi dito anteriormente por um amigo, eu pego os scripts pelo IBExpert, e executo no cliente, mas como disse o amigo, isso se torna inviavel a grande prazo, eu por exemplo já tenho mais 200 scripts... é complicado... agora esse sistema de patch é interessante... qnt à criar, poderia ser criado um patch pra cada atualizacao ou um ´super-patch´ com todos os patch, entendeu?
Mas como eh feito isso? existe algum software para isso, ou tenho que desenvolver tambem ese sistema?
[]s
Gostei + 0
30/03/2006
Adriano Santos
Pode crer [b:49a97253b2]titanius[/b:49a97253b2], eu entendi a idéia do [b:49a97253b2]Michael[/b:49a97253b2] só não consegui associar isso visualmente a minha aplicação. Pode detalhar um pouco mais o esquema [b:49a97253b2]Michael[/b:49a97253b2] pra gente?
Obs. Hoje na empresa nós temos os scripts para atualização da base de dados, porém nós enviamos ao usuário o arquivo .SQL ele executa o mesmo no IBOConsole, o que acho complexo demais para o tipo de usuário que temos, como falei anteriormente. Quando o usuário é muito ruim de informática a gente manda o rapaz do suporte técnico para realizar a atualização da base.
Vlw
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)