[firebase-br] Versão de banco de dados

Jeferson Oliveira jeferson em mvtec.com.br
Sex Jan 27 19:35:35 -03 2006


Olá!

No Paradox utilizava uma aplicação ServicePack para reestruturar o banco de 
dados. Tudo ia bem, exceto quando retornava-se para uma versão anterior sem 
antes executar o ServicePack para a versão correspondente.

Atualmente, com Firebird, o próprio executável se encarrega de atualizar ou 
"retroceder" a estrutura do banco de dados quando ncessário.
Até o momento esse modelo funciona bem.

Estrutura utilizada:

1) Um DataModule com um componente TIBScipt para cada versão, nomeado como 
IBScript + número da versão correspondente;
2) Dentro de um script há diversos comandos: Create table, alter table, 
create index, update, etc.;
3) Existe no banco de dados uma TabelaVersao, apenas com campo NumeroVersao;
4) Ao compilar uma versao que exige mudança na estrutura do banco de dados 
uma constante que identifica a versão atual do executável é incrementada;
5) Ao iniciar o sistema verifica-se se há diferenças entre a versão do 
executável e a versão atual do banco. Se a versão do banco for maior que a 
do executável, o que indica que o banco já foi acessado por uma versão mais 
nova, retrocede-se a primeira versão da aplicação, para garantir que toda a 
estrutura necessária para a versão esteja disponível;
6) O controle de tratamento de erros ao tentar criar um objeto já existente 
é feito pela aplicação;

Desvantagens precebidas:
1) Ter que criar um IBScript para cada versão;
2) Escrever o SQL de cada script (atualmente aproveito as senteças geradas 
pelo IBExpert, o que agiliza o trabalho);


Abaixo trecho do código (Delphi) utilizado.
Críticas são muito bem vindas.


var
  VersaoBanco: Integer;

const
  VersaoExecutavel = Número da versão do executável;

procedure Tfrmpesquisa.FormCreate(Sender: TObject);
begin
  if VersaoBanco = VersaoExecutavel then
    Exit
  else
  begin
    if VersaoBanco > VersaoExecutavel then
      VersaoBanco := 0;
    AtualizaVersao;
  end;
end;

procedure AtualizaVersao;
var
  ibsAtualizacao: TIBScript;
  Versao: Integer;
begin
  ibsAtualizacao := TIBScript.Create(Application);
  ibsAtualizacao.Database := ibdbAtualizar;
  ibsAtualizacao.Transaction := ibdbAtualizar.DefaultTransaction;

  for Versao := VersaoBanco + 1 to VersaoExecutavel do
  begin
    ibsAtualizacao.Script.Text := TIBScript(FindComponent('IBScript' + 
IntToStr(Versao))).Script.Text;
    ExecutaSentencasScript(ibsAtualizacao);
    ibsAtualizacao.Script.Text := 'update TabelaVersao set NumeroVersao = '
                                + QuotedStr(IntToStr(Versao)) + 
ibsAtualizacao.Terminator;
    ExecutaSentencasScript(ibsAtualizacao);
  end;
  ibsAtualizacao.Free;
end;

procedure Tfrmatualizabanco.ExecutaSentencasScript(ibsExecutar: TIBScript);
var
  TextoScript, SentencaSQL: String;
begin
  TextoScript := Trim(ibsExecutar.Script.Text);
  while TextoScript <> '' do
  begin
    SentencaSQL := RetornaCampo(TextoScript, ibsExecutar.Terminator[1], 1);
    ibsExecutar.Script.Text := SentencaSQL;
    TextoScript := Copy(TextoScript, Pos(SentencaSQL, TextoScript) + 
Length(SentencaSQL) + 1, Length(TextoScript));
    try
      ibsExecutar.ExecuteScript;
    except
      on E: Exception do
      begin
        Continue;
      end;
    end;
  end;
end;


Atenciosamente,

Jeferson Oliveira



"Gabriel Hilbig" <ghilbig em bol.com.br> escreveu 
na mensagem news:drdn1u$mea$1 em sea.gmane.org...
> Romulo;
>
> Temos este tipo de Controle desde o PDOX. Adaptamos para FB.
>
> Temos ARRAYs para
>
> aTABLES com IDTABLE, TABLENAME
> aFIELDS com IDTABLE, FIELDNAME, DATATYPE, VALIDATE ( tipo NOT NULL )
> aIDX com  IDTABLE,IDXTYPE,IDXNAME,IDXFIEDs
> aTRIGGERs com ... , .... , .....
> e ainda
> um array que faz o controle de GENERATORs que chamamos de VALIDATORs
> são SELECTs que corrigem os GENERATORs
>
> ==========================================================================
>
> Nosso Fonte faz leitura do BD no CLIENTE compara com os ARRAYs e havendo
> DIVERGÊNCIA deixa o
> BD do CLIENTE com a mesma ESTRUTURA do ARRAY.
>
> ==========================================================================
>
> Dica para LISTA :
> Conseguimos adaptar a Estrutura que tínhamos em PDOX estudando o FONTE do
> IBOCONSOLE.
>
> É DELPHI e OPEN SOURCE
>
> ============================================================================
>
> -- 
> Gabriel Hilbig
> Mg System Informática Ltda
> Av Otávio Rocha, 54 / 12o.
> 90020-150 Porto Alegre / RS
> 51.3226.1768 / 3226.6209
> www.mgsystem.inf.br
>
> "Fabrício Fadel Kammer" 
> <ffkammer em conchalnet.com.br> escreveu na 
> mensagem news:005701c6236d$f7d4e590$1b0aa8c0 em fabricio...
> Boa tarde lista,
>
> Gostaria da opnião de todos sobre controle de versão de banco de dados.
>
> Meu software está crescendo demais e queria ter uma forma de previnir
> que meus clientes utilizassem uma versão do executável que não é
> compatível com o banco de dados em uso. Alguém na lista faz esse tipo de
> controle? Se sim, como?
>
> Grato,
>
> Fabrício F. Kammer
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
> Para editar sua configuração na lista, use o endereço 
> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
>
>
>
>


--------------------------------------------------------------------------------


______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
Para editar sua configuração na lista, use o endereço 
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa 







Mais detalhes sobre a lista de discussão lista