приложение к статье http://www.ibase.ru/devinfo/db_repair.htm " ак починить базу данных Interbase", by KDV ѕример кода, перебирающего записи в "битой" таблице. Aleksey Emelyanov. ѕроходим по всей таблице и скидываем данные в другую базу с запоминанием последнего успешно считанного ключа.  ак только случаетс¤ exception, увеличиваем ключ на 1 и переоткрываем запрос с запис¤ми у которых ключ более чем наше значение ключа. соответственно все будет перебиратьс¤ до тех пор пока не выдем на нормальный промежуток, либо получим пустое множество. ѕри exception можно первичные ключи нечитаемых записей выводить в лог (TMemo на форме), а затем использовать дл¤ корректировки св¤занных таблиц, в которых используютс¤ эти идентификаторы. кусок рабочего кода: //ibRestore,ibBroken:TIBSQL; // в этих компонентах должен быть код вида // select * from table1 where id > :id // insert into table1 ... (:id, ... procedure TForm1.Button1Click(Sender: TObject); var success:boolean; Restored:integer; Broken:Integer; begin success:=false; idbilling:=StrToInt(edidBilling.Text); // идентификатор, с которого начинаем oldID:=idbilling; Restored:=0; Broken:=0; transcount:=0; while not success do begin dbBroken.Close; // бита¤ база dbBroken.Open; dbRestore.Close; // цела¤ база, куда перекачиваем записи dbRestore.Open; tsBroken.StartTransaction; tsRestore.StartTransaction; ibBroken.Params[0].AsInteger:=idbilling; inc(idbilling); edidBilling.Text:=IntToStr(idbilling); // запомним на вс¤кий случай application.ProcessMessages; try ibBroken.ExecQuery; success:=True; while not ibBroken.EOF do begin ibRestore.Close; ibRestore.Params[0].AsInteger:=ibBroken.Fields[0].AsInteger; // ............................................... ibRestore.Params[21].AsString:=ibBroken.Fields[21].AsString; idbilling:=ibBroken.FieldByName('idbilling').AsInteger; ibRestore.ExecSQL; ibRestore.Close; ibBroken.Next; Inc(Restored); Inc(transcount); if (transcount=1000) then begin edRestored.Text:=IntToStr(Restored); edidBilling.Text:=IntToStr(idbilling); application.ProcessMessages; transcount:=0; ibRestore.Transaction.Commit; ibRestore.Transaction.StartTransaction; end;//if then..end section end;//while..end except on e:exception do begin inc(Broken); Memo1.Lines.Add(inttostr(oldID)+' to '+inttostr(idbilling)+' by '+e.message); oldID:=idbilling; edBroken.Text:=inttostr(Broken); success:=False; end; end; transcount:=0; ibRestore.Transaction.Commit; ibRestore.Transaction.StartTransaction; edRestored.Text:=IntToStr(Restored); edidBilling.Text:=IntToStr(idbilling); application.ProcessMessages; end;//while..end end;