Serverseitige Programmierung 1 Trigger und Rules mit PostgreSQL Triggertypen ● Statement- / Row-Level Ausführung einmal pro Anweisung / einmal pro betroffenem Tupel ● Before / After / Instead (nicht mit PostgreSQL) ● in PostgreSQL: Trigger sind Funktionen Statement-Level ● ● CREATE TRIGGER foo BEFORE|AFTER INSERT|UPDATE|DELETE ON table FOR EACH STATEMENT EXECUTE PROCEDURE function Es kann nicht direkt in die Operation eingegriffen werden Row Level ● ● CREATE TRIGGER foo BEFORE|AFTER INSERT|UPDATE|DELETE ON table FOR EACH ROW EXECUTE PROCEDURE function über den Rückgabewert der Funktion kann ein before Trigger den Effekt der Anweisung verändern: null unterbindet die Aktion auf dem gegenwärtigen Tupel ein Tupel als Rückgabewert wird statt der eigentlich vorgesehen Änderung verwendet ● ● über die Speziellen Variablen old und new kann auf den Wert des aktuellen Tupels vor bzw. nach der Änderung zugegriffen werden Vorsicht: Änderungen an anderen Tupeln desselben Statements sind sichtbar, die Bearbeitungsreihenfolge ist nichtdeterministisch! Aktionen die durch Trigger ausgelöst werden können weitere Trigger auslösen! Trigger Funktionen ● ● können bei PostgreSQL in verschiedenen Programmiersprachen geschrieben sein für uns: PL/pgSQL prozedurale Erweiterungssprache für SQL, auch von Oracle und DB2 unterstützt Siehe auch: http://www.postgresql.org/docs/8.4/static/plpgsql.html ● Vor der ersten Benutzung: CREATE LANGUAGE plpgsql; Trigger Funktionen ● Funktionsdeklaration: CREATE FUNCTION foo() RETURNS trigger as $$ BEGIN ... RETURN some_variable; END; $$ LANGUAGE plpgsql; Trigger Funktionen CREATE FUNCTION correct_salary() RETURNS trigger AS $$ BEGIN IF new.occupation = 'Banker' AND new.bonus = 0 THEN new.bonus = 100000; END IF; RETURN new; END; $$ LANGUAGE plpgsql; Variablen ● Funktionen können lokale Variablen haben, die aber vorher deklariert werden müssen CREATE FUNCTION foo() RETURNS trigger AS $$ DECLARE i INTEGER; s VARCHAR; a_row sometable%ROWTYPE; x sometable.attribute%TYPE; BEGIN i := 1; SELECT * INTO a_row FROM sometable WHERE ...; new.blah = a_row.attribute; RETURN new; END; Rules ● Syntaktisches Konstrukt von PostgreSQL, das INSTEAD Trigger ersetzen kann CREATE RULE foo AS ON INSERT|UPDATE| DELETE TO table DO ALSO|INSTEAD ...; ● Kann z.b. benutzt werden, um Sichten änderbar zu machen