Zurück

DB-Trigger mit DML Return-Wert unter Oracle-8

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

Unter Oracle- 7:

  1. Die Applikation macht ein UPDATE des Salärs des Mitarbeiters 'KING'.

  2. 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).

  3. 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

Unter Oracle-8:

  1. 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.