Hi,
Ich möchte Änderungen an einer Tabelle in einer Interbase-
DB über Trigger in einer Export-Tabelle erfassen um so eine Liste von zu exportierenden Datensätzen zu erstellen.
Ich habe folgende Tabellen:
Code:
Export (
ID,
SCHLUESSELFELDID,
AENDERUNGSART VARCHAR(1),
AENDERUNGSDATUM
);
Kopf (
KOPF_ID
Daten...
);
PK: KOPF_ID
und folgende Trigger:
Code:
Kopf_AI_EXPORT for Kopf active after insert;
Kopf_AU_EXPORT for Kopf active after update;
Kopf_AD_EXPORT for Kopf active after delete;
die jeweils einen Eintrag in die "Export"-Tabelle entsprechend der Änderungs-Art "I", "U", "D" vornehmen (In Echt noch etwas genauer, so dass nur Änderungen an bestimmten Feldern einen Eintrag auslösen).
Das funktioniert für mich sehr gut. Ich habe so eine Tabelle, in der alle Änderungen (das es eine Änderung gab, nicht welche) protokolliert werden.
Diese Tabelle wird abgearbeitet und daraus ein Export mittels einem weiteren Programm ausgelöst.
Jetzt muss ich zusätzlich Änderungen an einer vom Kopf abhängigen Positions-Tabelle mit erfassen.
Hierzu habe ich die Positions-Tabelle, einen "Foreigen Key" auf den Kopf und entsprechende Trigger angelegt:
Code:
Detail (
DETAIL_ID,
KOPF_ID,
Daten...
);
PK: DETAIL_ID
FK: KOPF_ID -> Kopf.KOPF_ID on update cascade on delete cascade;
Detail_AI_EXPORT for Detail active after insert;
Detail_AU_EXPORT for Detail active after update;
Detail_AD_EXPORT for Detail active after delete;
Diese drei Trigger schreiben jetzt in die Export-Tabelle immer einen Eintrag mit der Änderungs-Art "U" für Update.
Jedes Hinzufügen, Änderung an einem Positions-Datensatz oder Löschen einer Position ist ein "Update" des Kopfes.
Das funktioniert bis auf einen Fall für mich korrekt:
Wenn der Kopf-Datensatz gelöscht wird, dann löscht der "Foreign Key" der Detail-Tabelle die entsprechenden Datensätze.
Die dadurch gelöschten Positionen schreiben einen "U"-Eintrag nach dem "D"-Eintrag des "Kopf_AD_EXPORT".
Diese Datensätze können vom Export-Programm nicht Exportiert werden, da sie nicht mehr in der Kopf-Tabelle vorhanden sind.
Auch eine Umstellung des "Detail_AD_EXPORT" auf "before delete" führt zum selben Ergebnis.
Anscheinend ist hier die Reihenfolge bei Interbase folgende:
Kopf.Delete ->
Kopf.BeforeDelete
Kopf.Delete
Kopf.AfterDelete
Durch "Foreign Key" ausgelöst:Detail.BeforeDelete
Detail.Delete
Dateil.AfterDelete
Ich kann jetzt den "Foreigen Key" auf
on update cascade on delete no action;
ändern und einen "Kopf.BeforeDelete"-Trigger erstellen, der die abhängigen Datensätze in der Detail-Tabelle löscht.
Dadurch würde die Reihenfolge passen. Das will ich aber eigentlich vermeiden, da der "cascade"-Aufruf so simple und gut funktioniert.
Gibt es hierfür bessere Lösungen oder ein besseres Konzept?