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

ffkammer em conchalnet.com.br ffkammer em conchalnet.com.br
Sex Jan 27 20:29:31 -03 2006


Olá Jeferson,

Gostei de sua idéia, acho que
é um caminho interessante
Mas tenho uma dúvida:
suponhamos que uma pesso executa o software com a nova versão que
atualizará o banco de dados e, durante o processo de
atualização, algum outro usuário resolva abrir o
sistema rede. Isso poderá danificar a estrutura do banco, pois,
até onde eu sei, não posso fazer atualizações
de estrturas com o banco em uso, correndo o risco de causar danos ao
mesmo.
Por isso que ainda não pensei em uma
solução utilizando o próprio executável para
atualização do banco de dados, tenho medo que durante uma
atualização mais alguém abra o sistema e isso cause
problemas sérios ao banco.
Já quanto a retroceder
versões acho muito perigoso, prefiro que o sistema não
libere acesso com o executável inferior ao necessário, pois
pode acarretar em perda de dados.

Abraços

Fabrício F. Kammer

>
--===============1457861527==
> 
> 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"



Mais detalhes sobre a lista de discussão lista