Trigger

(Event, Condition) \rarr Action

CREATE TRIGGER name {BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON tablename
[REFERENCING {{OLD | NEW} TABLE AS tablename}]
[FOR [EACH] {ROW | STATEMENT}]
[WHEN (condition)]
EXECUTE PROCEDURE functionname()
CREATE FUNCTION functionname() RETURNS trigger AS $$ ... $$ LANGUAGE plpgsql;

create trigger Definition des Triggers

insert, update, delete Definition von Events

before/after insert Aktion vor oder nach der Ausführung

for each row/statement Auf Tupel- / Query-Ebene

when Einschränkung

referencing old/new nur bei for each row- auch mitINSERT, UPDATE, DELETE

PROCEDURE function muss entweder null oder die selben Typen wie ein Tupel zurückgeben (Bei null wird abgebrochen)

Beispiele

Lehrende ab 6SWS erhalten automatisch einen Bonus

CREATE TRIGGER viellehre
AFTER INSERT ON Vorlesungen
FOR EACH ROW
WHEN NEW.sws > 6
update Professoren
set Professoren.gehalt = Professoren.gehalt+100
where Professoren.PersNr = NEW.gelesenvon

Man darf dozenten nur befördern, nicht degradieren.

CREATE OR REPLACE FUNCTION ouf() RETURNS TRIGGER AS $$
BEGIN
IF (OLD.Rang = 'Hoch' AND NEW.Rang = 'Niedrig') THEN RETURN OLD;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;CREATE TRIGGER keineDegradierung
BEFORE UPDATE ON Professor
FOR EACH ROW WHEN (OLD.RANG is not NULL)
EXECUTE PROCEDURE ouf();