Serverseitige Programmierung 1

Werbung
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
Herunterladen