Hallo Forum,
ich treffe immer wieder auf einen Anwendungsfall, den ich mal in ein paar
Worten kurz skizzieren möchte und für den ich noch keine wirklich “schöne”
Lösung gefunden habe:
Ausgangssituation: ich habe Angebote mit Angebotspositionen. Innerhalb der
Angebotspositionen gibt es Zwischensummen, die jeweils von den vorherigen
Positionen abhängig sind und selber Einfluss auf die nachfolgenden Positionen
haben.
Ich möchte die Zwischensummen gerne in der Datenbank und nicht im Client
berechnen, damit der Client “dumm” sein kann und keinerlei oder sehr wenig
Geschäftslogik enthält. Das macht die Umstellung auf einen anderen Client
einfach und falls verschiedene Clients im Einsatz sind (Web-Formular,
Java-Client, etc.) muss ich nicht in allen Clients Änderungen vornehmen,
wenn sich die Geschäftslogik geändert hat.
Die Berechnungen werden durch Trigger ausgelöst.
Das Problem dabei ist aber, wenn eine neue Angebotsposition hinzugefügt wurde,
oder eine bestehende geändert oder gelöscht wurde, so müssen alle nachfolgenden
Positionen geändert werden. Dadurch wird aber wieder der Trigger ausgelöst
und ich gerate unter bestimmten Umständen in einen unendlichen Regreß.
Verhindern tue ich das durch Abbruchbedingungen innerhalb der Trigger-Funktion.
Diese können je nach Anwendungsfall jedoch recht komplex sein und machen den
gesamten Code “hässlich” und schwer durchschaubar.
Gibt es eine kanonische Lösung für diesen Anwendungsfall?
Der Trigger löst “FOR EACH ROW” aus, würde hier “FOR EACH STATEMENT” helfen?
Könnte ich das vielleicht mit einem Cursor machen, den ich iterativ durchgehe
oder wird dann für jede Zeile wieder der Trigger ausgelöst ?
Das mit dem Cursor hatte ich schon mal versucht, erhielt aber die Fehlermeldung,
der Cursor könne nicht geöffnet werden, da schon in Benutzung. Sind Cursor vielleicht
global?
Ich freue mich auf Anregungen.