[firebase-br] ativar todos os indices
Jeferson Oliveira
jeferson em mvtec.com.br
Qui Jan 26 10:57:10 -03 2006
Caro Renato,
Não conheço uma forma automática de reativar todos os índices de um banco de
dados.
Estudando o assunto hoje pela manhã cheguei ao procedimento abaixo:
procedure AlteraEstadoIndices(ibqExecutar: TIBQuery;
LogErros: TStrings = nil;
Desativar: Boolean = False);
var
EstadoIndice: String;
Inativo: Char;
procedure AlteraIndices(AlterarChavesPrimarias: Boolean);
var
ibqIndices: TIBQuery;
PrimaryKey: Char;
NomeIndice: String;
begin
if AlterarChavesPrimarias then
PrimaryKey := '1'
else
PrimaryKey := '0';
ibqIndices := TIBQuery.Create(Application);
ibqIndices.Database := ibqExecutar.Database;
//Seleciona os índices que serão alterados;
ibqIndices.SQL.Text := 'select RDB$INDEX_NAME As NomeIndice '
+ 'from RDB$INDICES '
//Só interessam os índices que estejam atualmente em estado oposto ao
desejado;
+ 'where RDB$INDEX_INACTIVE = ' + Inativo + ' '
//Indices das tabelas de sistema e chaves primárias não devem ser
modificados;
+ ' and RDB$SYSTEM_FLAG is null '
+ ' and RDB$UNIQUE_FLAG = ' + PrimaryKey + ' '
+ 'Order by RDB$INDEX_NAME ';
ibqIndices.Open;
ibqIndices.First;
while not ibqIndices.Eof do
begin
NomeIndice := Trim(ibqIndices.FieldByName('NomeIndice').AsString);
ibqExecutar.Close;
ibqExecutar.SQL.Text := 'alter index ' + NomeIndice + ' ' +
EstadoIndice;
try
ibqExecutar.ExecSQL;
ibqExecutar.Transaction.CommitRetaining;
except
on E: Exception do
begin
if Assigned(LogErros) then
LogErros.Add('Erro na alteração do índice: ' + NomeIndice + '. '
+ E.Message);
end;
end;
ibqIndices.Next;
end;
end;
begin
//Chaves primárias devem ser manipuladas antes ou depois dos demais
índices
//dependendo da operação.
//Se essa regra não for respeitada ocorrerão erros de 'Internal GDS ...'
if Desativar then
begin
EstadoIndice := 'INACTIVE';
Inativo := '0';
AlteraIndices(False);
AlteraIndices(True);
end
else
begin
EstadoIndice := 'ACTIVE';
Inativo := '1';
AlteraIndices(True);
AlteraIndices(False);
end;
end;
//Exemplo de uso da função
procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.Clear;
AlteraEstadoIndices(IBQuery1, memo1.Lines);
ShowMessage('Processo de atualização concluído');
end;
Por favor nos informe se esse procedimento resolveu seu problema.
Atenciosamente,
Jeferson Oliveira
Analista de Sistemas
MV Tecnologia Ltda - Belo Horizonte (matriz)
jeferson em mvtec.com.br
"Renato-Eturbo" <renato em eturbo.com.br> escreveu na
mensagem news:169801c621e8$b0782170$2033a8c0 em programacao2...
Olá colegas Firebirdianos,
Tive um problema em meu banco de dados e a solução foi fazer um Backup e
depois um Restore desativando todos os indices, daí eu consegui eliminar o
registro que estava com problemas, mas agora tenho que reativar todos os
indices, alguém sabe alguma forma de fazer isso sem ter que ir um a um, o
banco de dados é grande está com mais de 1500 indices.
Obrigado.
______________________________________________
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