[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