Mit Datenbank-Trigger muss bekanntlich besonders vorsichtig umgegangen
werden. Eine Regel sagt, dass Datenbank-Trigger keine Werte manipulieren dürfen,
welche für die Applikation wichtig sind (in der Applikation angezeigt oder dort
ebenfalls manipuliert werden).
Beispiel -- Nachführen eines computed Attributs
-
Die Applikation macht ein UPDATE des Salärs des Mitarbeiters
'KING'.
-
Ein Datenbank-Trigger prüft das UPDATE und berechnet automatisch
die abhängige Kommission (nehmen wir an, die Kommission muss bei einer
Saläränderung automatisch 10% des Salärs betragen).
-
Die Applikation kennt den für die Kommission berechneten Wert
nicht. Nun gibt es drei Möglichkeiten:
- Die Applikation berechnet den Wert selber (wer stellt sicher, dass die Applikation
mit dem gleichen Prozentsatz wie der
Datenbank-Trigger arbeitet ? )
- Die Applikation zeigt noch einen alten, unberechneten Wert für die
Kommission an und lässt den Benutzer diesen "falschen" Wert auch
noch ändern !
- Die Applikation muss mit einem zusätzlichen SELECT den veränderten Wert
für die Kommission aus der Datenbank holen
-
Die Applikation macht ein UPDATE des Salärs des Mitarbeiters
KING und verlangt die Kommission als DML-Retum Wert zurück.
DB-Trigger
CREATE TRIGGER emp_comm
BEFORE INSERT OR UPDATE ON emp
FOR EACH ROW
BEGIN
:NEW.comm := :NEW.sal * 10 / 100;
END;
Applikation
DECLARE
local_comm emp.comm%TYPE;
BEGIN
UPDATE emp
SET sal = 7800
WHERE ename = 'KING'
RETURNING comm INTO local_comm;
dbms_output.put_line('comm: ' ||
TO_CHAR(local_comm));
END;
Fazit
Die Applikationsentwicklung unter Oracle-8 mit DML-Returnwerten
vereinfacht die Programmierung wesentlich und führt zu stabileren Applikationen. Oft
müssen geänderte Werte nicht erneut mit einem zusätzlichen SELECT gelesen
werden, was sich auch auf die Performance positiv auswirkt.
|