Announcement

Collapse
No announcement yet.

Timestamp

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Timestamp

    Hallo,

    nachdem nun meine Tabelle schön zusammengeführt ist und ein Generator zum automatischen kreieren des PK gebaut ist, fehlt mir zu meinem Glück nur noch der Insert und der Update Timestamp.

    Die Felder gibt es, doch wie kommen da Werte rein, ich habe bislang keine Funktion im Umfeld von FB gefunden.

    Kann mit jemand weiterhelfen? (warscheinlich bin ich mal wieder mit Blindheit geschalgen, oder ich denke in die falsche Richtung!)

    Danke
    Heinz-Dieter

  • #2
    Den aktuellen Timestamp bekonmnst du per CURRENT_TIMESTAMP Kontextvariable

    Comment


    • #3
      Hallo Markus,

      danke für den Tipp, bin nun auch bereits weitergekommen.

      hier mal die Zeilen von Create Table
      Code:
          stb_id bigint not null primary key,
          stb_insert timestamp default current_timestamp not null,
          stb_letzte_aend timestamp default current_timestamp on update current_timestamp not null
      in der letzten Zeile streikt das system, was ich möchte ist ja hoffentlich klar? stb_insert und stb_letzte_aend mit current_time vorbelegen und bei änderungen eben stb_letzte_aend aktuallisieren.

      Ist das so der richtige/mögliche Weg, oder ist in dem Fall ein Trigger der bessere Weg?

      Heinz-Dieter

      Comment


      • #4
        Der Anlage Timestamp kann man so setzen, die letzte Änderung besser in einem Trigger

        Comment


        • #5
          Hallo,
          habe das mal probiert, jedoch will das system nicht so wie ich.

          Struktur:
          Code:
          CREATE TABLE tbSTABEST
          (
              chip_nr char(7) not null,
              name varchar(50) not null,
              vna varchar(50) not null,
              str_nr varchar(50),
              plz varchar(8),
              ort varchar(40),
              verein varchar(50),
              sex char(1) not null,
              gebdat date not null,
              nation char(3),
              email varchar(50),
              stb_id bigint not null primary key,
              stb_insert timestamp default current_timestamp not null,
              stb_letzte_aend timestamp default current_timestamp not null
          );
          und nun der Trigger dazu:
          Code:
          SET TERM ^ ;
          
          CREATE TRIGGER trgstabet_upt FOR TBSTABEST
          ACTIVE AFTER UPDATE POSITION 0
          AS 
          BEGIN 
              new.STB_LETZTE_AEND = current_timestamp;
              /* enter trigger code here */ 
          END^
          
          SET TERM ; ^
          und nun die Fehlermeldung:
          Starting transaction...
          Preparing query:

          CREATE TRIGGER trgstabet_upt FOR TBSTABEST
          ACTIVE AFTER UPDATE POSITION 0
          AS
          BEGIN
          new.STB_LETZTE_AEND = current_timestamp;
          /* enter trigger code here */
          END
          Prepare time: 0,043s
          Plan not available.


          Executing...
          Done.
          170 fetches, 7 marks, 2 reads, 0 writes.
          1 inserts, 1 updates, 0 deletes, 48 index, 0 seq.
          Delta memory: 14452 bytes.
          RDB$TRIGGERS: 1 inserts. 1 updates.
          Total execution time: 0,049s
          Script execution finished.
          Commiting transaction...
          *** IBPP::SQLException ***
          Context: Transaction::Commit

          SQL Message : -151
          This column cannot be updated because it is derived from an SQL function or expression.

          Engine Code : 335544359
          Engine Message :
          attempted update of read-only column

          Preparing query:

          CREATE TRIGGER trgstabet_upt FOR TBSTABEST
          ACTIVE AFTER UPDATE POSITION 0
          AS
          BEGIN
          new.STB_LETZTE_AEND = current_timestamp;
          /* enter trigger code here */
          END
          Prepare time: 0,023s
          Plan not available.


          Executing...
          Error: *** IBPP::SQLException ***
          Context: Statement::Execute(

          CREATE TRIGGER trgstabet_upt FOR TBSTABEST
          ACTIVE AFTER UPDATE POSITION 0
          AS
          BEGIN
          new.STB_LETZTE_AEND = current_timestamp;
          /* enter trigger code here */
          END )
          Message: isc_dsql_execute2 failed

          SQL Message : -607
          This operation is not defined for system tables.

          Engine Code : 335544351
          Engine Message :
          unsuccessful metadata update
          DEFINE TRIGGER failed
          attempt to store duplicate value (visible to active transactions) in unique index "RDB$INDEX_8"

          Total execution time: 0,047s
          gibt es da noch irgendwelche randbedingungen die ich noch nicht kenne?

          H.-D.

          Comment


          • #6
            Hallo,

            verwende einen BEFORE UPDATE Trigger, anstatt eines AFTER UPDATE Trigger.

            Thomas
            Thomas Steinmaurer

            Firebird Foundation Committee Member
            Upscene Productions - Database Tools for Developers
            Mein Blog

            Comment


            • #7
              Danke!!

              jetzt funktioniert alles. Zumindest für diese Tabelle. Weiteres in einem neuen Thread.

              Kannst du bitte auch ein paar Worte dazu verlieren warum "BEFORE UPDATE" und nicht "AFTER UPDATE". Was ist der Haken an der Sache?

              Hei-Die

              Comment


              • #8
                Hallo,

                naja, weil es eben nur in einem BEFORE Trigger erlaubt ist, Feldwerte für die Tabelle, auf der der Trigger "liegt", zu setzen.

                Nach einem BEFORE Trigger werden dann Tabellen-Constraints (Unique Constraint etc.) überprüft und wenn es hier keine Probleme gab, kommen die AFTER Trigger.

                Thomas
                Thomas Steinmaurer

                Firebird Foundation Committee Member
                Upscene Productions - Database Tools for Developers
                Mein Blog

                Comment

                Working...
                X