Ich habe so ca. 20 Tabellen. Alle Tabellen sollen eine Spalte namens ‘touch’ haben. In der soll immer der Zeitpunkt festgehalten werden, wann die letzte Änderung statt fand. Für ein INSERT ist das nicht schwer… das kann man beim Anlegen der Tabelle festlegen.
Aber geht das auch automatisch bei UPDATEs?
Ich habe eine Template-Tabelle in der ‘touch’ und noch weitere Spalten definiert sind. Von dieser Tabelle möchte, die anderen 20 Tabellen ableiten (feine Sache bei PostgreSQL). An dieser Tabelle soll auch die Funktion angehängt werden, die die Zeit aktualisiert. Ich hab es mit einer Regel versucht. Bekam aber immer die Fehlermeldung, dass es eine Endlosschleife gibt…
Jemand meinte auch das es vielleicht mit Triggern geht. Da ich keine Erfahrung damit habe, wende ich mich vertrauensvoll an euch…
Ich verwende für so etwas auch einen Trigger und eine kleine Funktion:
-- ###########################################################################
-- will be called on update from a trigger and set last_change
-- parameter:
-- - none (NEW, OLD by trigger)
-- return:
-- - data type trigger
CREATE OR REPLACE FUNCTION public.set_last_change_at()
RETURNS TRIGGER
AS 'BEGIN
NEW.last_change = NOW();
RETURN NEW;
END;'
LANGUAGE 'plpgsql';
Das setzt voraus, das die Tabelle eine Spalte mit einem Timestamp hat, die ‘last_change’ heisst.
Definiert wird der Trigger mit:
-- set the current timestamp on 'last_change'
CREATE TRIGGER <triggername> BEFORE UPDATE ON <schema>.<table> FOR EACH ROW
EXECUTE PROCEDURE public.set_last_change_at();