Trigger

Mit Triggern kann man vorher definierte Funktionen bei bestimmten Ereignissen aufrufen. Diese Ereignisse sind:

  • INSERT
  • DELETE
  • UPDATE

Weiterhin kann man angeben, ob die Funktion vorher, nachher oder gar als Ersatz für das Ereignis ausgeführt wird. Die Schlüsselworte sind

  • BEFORE
  • AFTER
  • INSTEAD OF

Um einen Trigger zu spezifizieren, schreibt man dann:

CREATE TRIGGER nachricht_neue_pruefung
AFTER INSERT ON pruefungen
FOR EACH ROW
EXECUTE PROCEDURE pruefer_benachrichtigen();

Die aufgerufene Prozedur muss eine PL/pgSQL-Funktion sein, die als Rückgabewert TRIGGER hat und in ihrer Deklaration keine Parameter entgegennimmt. Trotzdem steht das Array TG_ARGV zur Verfügung, das doch wieder die Verwendung von Parametern erlaubt, so etwa:

CREATE OR REPLACE FUNCTION lösch_warnung() RETURNS TRIGGER AS $$
BEGIN
  RAISE NOTICE 'Warnung, lösche %', TG_ARGV[0];
  RETURN NULL;
END
$$ LANGUAGE plpgsql;

CREATE TRIGGER dummytrigger
BEFORE DELETE ON studenten
FOR EACH ROW
EXECUTE PROCEDURE lösch_warnung('student');

Die Spezifikation FOR EACH ROW bedeutet, dass der Trigger für jeden angefassten Eintrag feuert. Stattdessen kann man auch FOR EACH STATEMENT schreiben, dann wird der Trigger unabhängig von der Anzahl der modifizierten Zeilen gefeuert.

Für Trigger gibt es kein OR REPLACE. Stattdessen müssen Sie den Trigger etwa mit DROP TRIGGER IF EXISTS triggername ON tabellenname löschen.

Aufgabe: Kann es passieren, dass die Funktion eines FOR EACH ROW-Triggers nicht ausgeführt wird, oder kann es sein, dass die Funktion eines FOR EACH STATEMENT-Triggers nicht ausgeführt wird, obwohl der Trigger feuert? Überlegen Sie sich zunächst die Antwort, dann schreiben Sie Code, der ihre Vermutung überprüft.

results matching ""

    No results matching ""