Wenn…
- BEFORE
- AFTER
- INSTEAD OF - bei Views
- INSERT - mit
NEW - UPDATE - mit
OLD - DELETE - mit
OLDundNEW - ON
<tabelle> - ON
<view>
Erstellen der Funktion
CREATE FUNCTION ... RETURNS TRIGGER AS
$$ BEGIN
...
END; $$ LANGUAGE plpgsql;- Ähnlich wie eine Funktion mit Return-Typ
void
Erstellen des Triggers
CREATE TRIGGER ... {BEFORE | AFTER | INSTEAD OF}
{INSERT | UPDATE | DELETE} ON ...
FOR EACH {ROW | STATEMENT} [WHEN (...)]
EXECUTE PROCEDURE ...();CREATE TRIGGER
INSTEAD OF- Ermöglichen Insert/Update/Delete auf jede View- Beispiel: Falls die View ein Join ist, kann der Trigger das Insert auf beide gejointe Tabellen ausführen
FOR EACH
ROW- Triggerfunktion wird für jedes geänderte Element aufgerufen, Zugriff auf das geänderte Tupel mitOLDundNEWSTATEMENT- Triggerfunktion wird für das gesamte Statement nur einmal aufgerufen, kein direkter Zugriff auf Tupel
Beispiele
BEFORE
CREATE OR REPLACE FUNCTION preis_trigger() RETURNS TRIGGER AS $$
DECLARE anz_gratis_produkte INT;
BEGIN
IF (NEW.preis < 0) THEN NEW.preis = 0; END IF;
RETURN NEW;
END; $$ LANGUAGE plpgsql;CREATE TRIGGER preis_trigger BEFORE INSERT OR UPDATE ON produkte
FOR EACH ROW EXECUTE PROCEDURE preis_trigger();INSTEAD OF
CREATE VIEW meine_view AS
SELECT p.produktnr, p.bezeichnung, p.preis, p.hersteller, h.land
FROM produkte p JOIN hersteller h ON p.hersteller=h.firma;CREATE OR REPLACE FUNCTION meine_view_trigger() RETURNS TRIGGER AS $$
BEGIN
INSERT INTO hersteller (firma, land)
VALUES (NEW.hersteller, NEW.land)
ON CONFLICT (firma) DO UPDATE SET land=EXCLUDED.land;
INSERT INTO produkte (produktnr, bezeichnung, preis, hersteller)
VALUES (NEW.produktnr, NEW.bezeichnung, NEW.preis, NEW.hersteller);
RETURN NEW;
END; $$ LANGUAGE plpgsql;CREATE TRIGGER meine_view_trigger INSTEAD OF INSERT ON meine_view
FOR EACH ROW EXECUTE PROCEDURE meine_view_trigger();