Triggers
Het kan wenselijk zijn de database enkele acties uit te laten voeren op het moment dat er “iets” gebeurt met een tabel. Dat “iets” is bijvoorbeeld een INSERT, UPDATE of DELETE. In PostgreSQL kun je werken met triggers welke afgaan op een bepaalde gebeurtenis, ook wel event genoemd.
Stel dat we een reservering toevoegen, daarbij is het van groot belang dat de aankomstdatum vóór de vertrekdatum ligt (logisch toch). Je bouwt deze check natuurlijk in je applicatie, maar wat nu als je daar een fout maakt? Zou je het ook niet liever op je database vastleggen? Die is daar namelijk veel beter in en werkt ook nog als je aanpassingen maakt aan je applicatie of nog erger: als andere applicaties, waar je bijvoorbeeld geen invloed op hebt, gebruik maken van je database.
Een trigger roept altijd een functie aan, zoals reeds bekend schrijven we de functies in PL/pgSQL:
2
3
4
5
6
7
8
9
10
11
'
BEGIN
IF( NEW.datum_aankomst > NEW.datum_vertrek ) THEN
RAISE EXCEPTION ''Aankomstdatum moet voor vertrekdatum liggen'';
END IF;
RETURN NEW;
END;
'
LANGUAGE 'plpgsql';
De functie is vrij eenvoudig van opzet, een IF-constructie controleert of de aankomstdatum groter is als de vertrekdatum, als dit het geval is wordt er een error gegenereerd, zo niet returned de functie netjes zijn trigger en wordt de wijziging / toevoeging aangebracht.
Om de triggerfunctie nu nog aan een tabel te koppelen dient de daadwerkelijke trigger nog aangemaakt te worden, dit kan met het volgende statement:
2
3
4
5
BEFORE INSERT OR UPDATE
ON reservering
FOR EACH ROW
EXECUTE PROCEDURE check_reservering();
Je ziet hier dat ik de trigger afvuur vóór een INSERT of UPDATE, bij deze events mogen we in de aangeroepen trigger-functie gebruik maken van de variabele NEW. Dit is een zgn. ROWTYPE-variabele en bevat te velden van het nieuwe record welke je gaat invoeren of bijwerken.
Meer informatie over triggers vind je op http://www.postgresql.org/docs/8.1/static/plpgsql-trigger.html.
Inhoudsopgave
- Inleiding
- Voorbeeld-case
- Overerving in PostgreSQL
- Aanmaken van tabellen en het leggen van relaties
- Views
- PL/pgSQL functies en procedures
- Triggers
- Check constraints en domains
- Conclusie