Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#4

AW: Firebird-Restore: auch ohne exclusiven Zugriff möglich?

  Alt 22. Dez 2022, 17:38
Monitoringtabellen von FireBird benutzen?

In MON$STATEMENTS stehen die laufenden SQL-Statements, in MON$ATTACHMENTS stehen die offenen Verbindungen.

Mit DELETE FROM MON$STATEMENTS WHERE MON$ATTACHMENT_ID = :ATTACHMENT_ID beendest Du ein laufendes Statement, mit DELETE FROM MON$ATTACHMENTS WHERE MON$ATTACHMENT_ID = :ATTACHMENT_ID beendest Du eine aktive Datenbankverbindung (jeweils ohne Rücksicht auf Verluste, ohne Nachfrage, ...)

Sinngemäß ungetestet hingedaddelt:
Delphi-Quellcode:
// Statement für das Löschen einer bestimmten Verbingung erstellen
qryExec.SQL.Text := 'DELETE FROM MON$ATTACHMENTS WHERE MON$ATTACHMENT_ID = :ATTACHMENT_ID; commit;';
// Alle Attachment_IDs zu offenen Verbindungen ermitteln,
// sofern Du dich als letzter User an der DB angemeldet hast,
// wird Deine eigene Verbindung zuletzt beendet.
// Oder halt die eigene ATTACHMENT_ID vorher ermitteln und per Where-Bedingung ausklammern.
qry.SQL.Text := 'select MON$ATTACHMENT_ID as ATTACHMENT_ID from MON$ATTACHMENTS order by MON$ATTACHMENT_ID';
qry.Open;
while not qry.EoF do begin
  qryExec.SQL.ParamByName('ATTACHMENT_ID').AsInteger := qry.FieldByName('ATTACHMENT_ID').AsInteger;
  qryExec.ExecSQL;
  qry.Next;
end;
qry.Close;
Damit sollten dann alle Datenbankverbindungen weg sein, einschließlich Deiner eigenen Verbindung.

Eventuell geht es ja auch mit
Delphi-Quellcode:
qryExec.SQL.Add('execute block as');
qryExec.SQL.Add('begin');
qryExec.SQL.Add(' DELETE FROM MON$ATTACHMENTS;');
qryExec.SQL.Add(' commit;');
qryExec.SQL.Add('end');
qryExec.SQL.ExecSQL;
Da damit dann auch die eigene Verbindung weg ist, könnte ein Try-Execpt drumrum nicht schaden

Und: Diese Lösung ist (wenn sie so funktioniert) garantiert äußerst grenzwertig

Geändert von Delphi.Narium (22. Dez 2022 um 17:40 Uhr) Grund: Schreibfehler
  Mit Zitat antworten Zitat