[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