mysql-Timestamp -Ersatz

Hallo,

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…

Danke fürs Lesen und Antworten

Clemens

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();

Danke das sieht garnicht so schwer aus… aber damit ich das richtig verstehe:

set_last_change_at() packt einfach in die neue Query ein “last_chang = NOW()” ?


und der Trigger… ruft die Triggerfunktion auf. Der übergibt nix.

mit new und old lann die Triggerfunktion auf die alte und neue Query zugreifen? Und das obwohl diese Sachen garnicht übergeben wurden?

mit NEW.last_change kann ich Werte in der Query ändern obwohl die garnicht in der UPDATE-Anweisung standen? Faszinierend…

Clemens

Du hast es richtig erfasst :wink:

Die Psql Doku zu Triggern ist da noch mal ausführlich, da steht das alles drin.