Trigger
(Event, Condition) 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();