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

Jeferson Oliveira jeferson em mvtec.com.br
Seg Jan 30 18:59:40 -03 2006


Fabrício,

Você pode utilizar o componente IBDatabaseInfo da paleta "Interbase".
Para verificar o número de conexões será necessário conectar-se ao banco de 
dados, portanto ConexoesAtivas = 1 significa que a conexão atual é a única 
existente.

Exemplo:

function ConexoesAtivasBD(dbVerificar: TIBDatabase): Integer;
var
  IBDatabaseInfo: TIBDatabaseInfo;
begin
  IBDatabaseInfo := TIBDatabaseInfo.Create(Application);
  IBDatabaseInfo.Database := dbVerificar;
  Result := IBDatabaseInfo.UserNames.Count;
  IBDatabaseInfo.Free;
end;


Atenciosamente,

Jeferson Oliveira
Analista de Sistemas
MV Tecnologia Ltda - Belo Horizonte (matriz)


"Fabrício Fadel Kammer" 
<ffkammer em conchalnet.com.br> escreveu na 
mensagem news:002901c625c8$a5ccb0e0$1b0aa8c0 em fabricio...
Vc sabe como fazer para recuperar o número de conexões atuais do BD?
Estou usando IBX.

-----Mensagem original-----
De: lista-bounces em firebase.com.br 
[mailto:lista-bounces em firebase.com.br]
Em nome de Jeferson Oliveira
Enviada em: segunda-feira, 30 de janeiro de 2006 11:57
Para: lista em firebase.com.br
Assunto: Re: [firebase-br] Versão de banco de dados


Olá Fabrício!

Suas considerações são muito importantes. Para que esse processo
funcione com segurança (ou com menor risco) alguns cuidados precisam ser
tomados:

1) A versão nova do executável, antes de iniciar o processo de
atualização, verifica o número de conexões ativas no banco de dados.
Havendo mais de uma conexão é exibido um alerta recomendando que todos
os usuários saiam do sistema, ... O processo só será iniciado se não
houver outro acesso ao banco;

2) Uma tabela de controle do sistema possui dois campos ligados a esse
processo: Atualizando CHAR(1) que indica se o processo está em
andamento, e DataHoraAtualizacao DATE que armazena a data e a hora do
início do processo. Os dois campos são modificados no início da
atualização, e após a conclusão o campo Atualizando é modificado para
indicar que não está mais em processo de atualização;

3) A nova execução do sistema em outro ponto da rede (versão nova ou
antiga) exibe um 'Aguarde ...' se o banco estiver em atualização.

4) Considera-se um banco em atualização: Atualizando = 'S' e
ConexoesAtivas  > 1 e DataHoraAtualizacao > Agora - 15 minutos. Se
Atualizando e há apenas uma conexão ativa, o processo de atualização não
está mais em andamento. Se Atualizando, e há mais conexões ativas (uma
delas pode ser a responsável pela atualização) verifica-se o tempo
decorrido desde o ínicio da atualização. Se esse tempo ultrapassar o
limite estabelecido, o processo de atualização provavelmente não está
mais em andamento. Nos dois casos acima o valor do campo Atualizando é
alterado para indicar que o processo não está mais em andamento.

O processo normalmente é muito rápido, mesmo em bancos relativamente
grandes (2 Gb), executando o sistema pela rede, raramente dura mais que
2 minutos. Por precaução é utilizado um tempo limite de 15 minutos.

5) Como percebe-se há o risco de o sistema ficar inacessível por 15
minutos, o que pode ser muito para alguns ramos de atividade. Uma boa
notícia que posso lhe dar é que em quase 1 ano utilizando esse processo,
em mais de 500 clientes, não tivemos nenhum problema desse tipo.


Cuidados operacionais a serem observados pelos responsáveis por
atualização de versões (clientes, equipes de suporte, etc.).

1) Instalações de novas versões devem ser feitas em horários de menor
atividade do sistema;
2) Logo após instalar o sistema executá-lo para que seja feita a
atualização já nesse momento, e não quando um usuário que precisa
utilizar o sistema for acessá-lo pela próxima vez;
3) Utilizar para esse fim o melhor computador disponível, para dar mais
agilidade ao processo;

Quanto a retroceder versões concordo com sua opinião. A idéia era manter
compatibilidade caso uma nova versão apresentasse erro grave e fosse
necessário voltar a versão anterior. Que tenhamos notícia isso nunca
ocorreu, mas de toda forma planejamos em breve alterar esse ponto.


Um abraço!
Jeferson Oliveira


<ffkammer em conchalnet.com.br> escreveu na
mensagem
news:2117.200.99.34.10.1138400971.squirrel em webmail.conchalnet.com.br...

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"
______________________________________________
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