Tach zusammen
Ich versuche via FireDac auf eine Oracle-
DB zuzugreifen, was soweit auch erstmal ganz gut funktioniert. Nun besteht aber die Notwendigkeit, bei Programmstart einen Trigger zu erstellen, der dann bei Programmende wieder gedroppt wird.
Codemäßig sieht das im FormShow folgendermaßen aus:
Delphi-Quellcode:
DBCOnnection.Open;
QueryData.Open;
QueryTriggerExists.Open;
AlerterDataChange.Register;
if QueryTriggerExists.RecordCount=0 then
begin
DBCommand.CommandText.Clear;
DBCommand.CommandText.Add('CREATE OR REPLACE TRIGGER PROD.TR_CHANGE_TABLE_DATA');
DBCommand.CommandText.Add('AFTER DELETE OR INSERT OR UPDATE ON PROD.DATA');
DBCommand.CommandText.Add('BEGIN');
DBCommand.CommandText.Add('SYS.DBMS_ALERT.SIGNAL (''DATA_CHANGE'', ''TEST_ALERT'');');
DBCommand.CommandText.Add('END;');
DBCommand.Execute;
end;
Während der Programmausführung kommen die extern herbeigeführten Änderungen (über APEX) auch problemlos im verknüpften DBGrid an.
Beim Schließen des Fensters soll dann der Trigger aber wieder gelöscht werden:
Delphi-Quellcode:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
AlerterDataChange.Unregister;
QueryTriggerExists.Refresh;
if QueryTriggerExists.RecordCount>0 then
begin
//trigger erst deaktivieren, dann löschen
DBCommand.Execute('ALTER TRIGGER PROD.TR_CHANGE_TABLE_DATA DISABLE');
DBCommand.Execute('DROP TRIGGER PROD.TR_CHANGE_TABLE_DATA');
end;
DBConnection.Close;
end;
Und hier tritt folgendes Phänomen auf. Im Debug-Modus aus Delphi heraus bekomme ich eine EOCINativeException:
"[FireDac][Phys][Ora] ORA-01013: Benutzer hat Abbruch des aktuellen Vorgangs angefordert"
Starte ich die kompilierte Exe aber ohne die
IDE funktioniert alles problemlos. Kann mir das Phänomen jemand erklären?
Oder mache ich prinzipiell etwas falsch? Muss dazu sagen, dass Oracle generell und der Zugriff via Firedac noch ziemliche böhmische Dörfer für mich sind.
Vieln Dank im Voraus
Sven