Timestamp automatisch

Hallo, keine Ahnung, ob ich in der richtigen Rubrik bin. Hab nichts anderes passendes gefunden. Falls falsch, sagt mir bitte, wo es besser gewesen wäre. Ich hab in einer Tabelle 2 Timestamp-Felder. Eins soll beim Neuanlegen eines Datensatzes das aktuelle Datum speichern, das andere immer das Datum der letzten Änderung. Die letzte Änderung habe ich erreicht, indem ich in dem Feld als Standardwert “now()” eingetragen habe. Leider wird das Datum dann auch beim Neuanlegen gespeichert. Kann ich das so einrichten, dass das Datum der letzten Änderung auch wirklich nur gespeichert wird, wenn der Datensatz geändert wird (UPDATE)? Und wie schaffe ich es, den anderen Timestamp bei einem neuen Datensatz (INSERT) zu speichern? Geht das mit Funktionen oder Regeln? Oder kann ich das schon beim Erstellen der Tabelle bei der jeweilgen Timestamp-Spalte angeben? Viele Grüsse Bert

Für neuangelegte Datensätze: default now() (oder current_timestamp), für Updates ein Trigger, der das macht. Beispiele IMHO in der Doku.

Andreas

Wenn nicht in der Doku, dann aber garantiert in meinem Buch im Anhang. Außerdem sind alle Beispiele auf der Webseite zum Buch:

Hauptseite [PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler]

Ich wußte doch, daß ich erst kürzlich das sah …

Andreas

Hallo,

danke für die Antworten. Ich werde mir dann wohl die Trigger mal genauer anschauen.

Gruss
Bert

Du solltest für beide Spalten einen Trigger verwenden. Andernfalls gibt mal irgendjemand für die “eingefügt am” Spalte einen älteren/neueren Wert an und der wird übernommen.

Der Defaultwert funktioniert nur, solange kein expliziter Wert angegeben wird.

Hmm, eigentlich wollte ich den Wert von den Anwendern auch nicht direkt ändern lassen. Soll nur angezeigt werden. Aber vielleicht ist es doch besser für die Spalte auch einen Trigger zu verwenden. Schaden kann es ja eigentlich nicht.

Ich schreibe jetzt hier mal den Code für den Trigger rein, damit andere auch was davon haben. Hab ich gefunden und abgeändert. Scheint prima zu funktionieren. Aber vielleicht entdeckt ihr ja da noch Fehler.

CREATE OR REPLACE FUNCTION date_lastchange() RETURNS trigger AS '
    BEGIN
        -- Timestamp aktualisieren (letzte Änderung)
        NEW."datum_Geaendert" := ''now'';
        RETURN NEW;
    END;
' LANGUAGE plpgsql;



CREATE TRIGGER date_lastchange BEFORE UPDATE ON "01_Stamm"
    FOR EACH ROW EXECUTE PROCEDURE date_lastchange();

Vielen Dank nochmal…
Gruss Bert

Du hättest wirklich mal auf den Link schauen sollen, den ich weiter oben gepostet habe.

Dein Trigger greift nur bei einem UPDATE, beim Einfügen kann ich jedoch beliebige Zeiten angeben.

Außerdem änderst du beim Update ein “eingefügt”-Zeitstempel. Das ist logisch falsch.

In der URL gibt es ein komplett fertiges Beispiel, das alle Sonderfälle abfängt - übernimm das einfach.

Welches PG, also welcher Version, verwendest Du?

Seit einigen Versionen ist es üblich, Dollarquoting zu verwenden (in Funktionen), macht die Sache einfacher.

Andreas

Das war ja auch nur meine Lösung für den Trigger für das UPDATE der Timestamp-Spalte für “zuletzt eingefügt”. Wenn der Datensatz neu angelegt wird, dann steht da nichts drin. Dafür gibt es die Spalte für “Datum neu angelegt”, die auf DEFAULT NOW() gesetzt ist und beim Neuanlegen dort das Datum reinschreibt und danach auch nicht mehr verändert wird. Na ja, bin noch relativ neu bei PostgreSQL. Ist das nicht richtig so?

Du meinst den Link zu dem Buch mit den Beispielen? Da hab ich reingeschaut, aber kein Beispiel zu meinem Probelm gefunden. Das müsste dann doch unter “Serverseitige Programmierung” stehen? Da sehe ich aber nur allgemeine Beispiele für Funktionen und Trigger. Aber nichts zu INSERT und UPDATE von Timestamp-Spalten. Oder bin ich blind?

Gruss
Bert

Hallo,

ich habe Version 8.4. Das oben genannte Beispiel hatte ich so im Internet gefunden. Was ist der Unterschied zum Dollarquoting? Bzw. was ist schlecht an meinem Besipiel?

Gruss
Bert

Da ist nix schlecht, aber mit Dollarquoting leitest Du den Body der Funktion mit $$ oder $BODY$ oder so ein und beendest ihn auch wieder so. Innerhalb kannst Du dann einfache ’ für Text verwenden.

Andreas

Uups, sorry, ich bin wohl wirklich blind. Hab das Beispiel unter “Anhang” gefunden…

Gruss
Bert

OK danke, das ist natürlich ein Vorteil. Dann werde ich das in Zukunft auch mit $$ verwenden.

Gruss
Bert

Bitte schön :wink: