Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Timestamp automatisch

  1. #1
    gigabert ist offline Neuer Benutzer
    Registriert seit
    31.07.2009
    Beiträge
    20

    Standard 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

  2. #2
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von gigabert Beitrag anzeigen
    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
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.020

    Standard

    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]
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  4. #4
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von ads Beitrag anzeigen
    Wenn nicht in der Doku, dann aber garantiert in meinem Buch im Anhang. Außerdem sind alle Beispiele auf der Webseite zum Buch:
    Ich wußte doch, daß ich erst kürzlich das sah ...

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  5. #5
    gigabert ist offline Neuer Benutzer
    Registriert seit
    31.07.2009
    Beiträge
    20

    Standard

    Hallo,

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

    Gruss
    Bert

  6. #6
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.020

    Standard

    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.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  7. #7
    gigabert ist offline Neuer Benutzer
    Registriert seit
    31.07.2009
    Beiträge
    20

    Standard

    Zitat Zitat von ads Beitrag anzeigen
    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.

    Code:
    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

  8. #8
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.020

    Standard

    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.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  9. #9
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von gigabert Beitrag anzeigen
    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.

    Code:
    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

    Welches PG, also welcher Version, verwendest Du?

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

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  10. #10
    gigabert ist offline Neuer Benutzer
    Registriert seit
    31.07.2009
    Beiträge
    20

    Standard

    Zitat Zitat von ads Beitrag anzeigen
    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.
    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?

    Zitat Zitat von ads Beitrag anzeigen
    In der URL gibt es ein komplett fertiges Beispiel, das alle Sonderfälle abfängt - übernimm das einfach.
    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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum