cancel
Showing results for 
Search instead for 
Did you mean: 

Trigger bei Neuanlage eines Datensatzes

1,095

Grüße Euch, wie müsste ein Trigger aussehen, der bei der Neuanlage eines Datensatzes ein Datum in der Tabelle mit dem Server - Datum füllt. Ich mache das bisher händisch aber es ist ein riesen Aufwand... VG Franz

[Translation] Greetings, what should a trigger look like that fills a date in the table with the server date when creating a new data record. I've been doing this manually so far, but it's a huge effort

Accepted Solutions (0)

Answers (3)

Answers (3)

chris_keating
Product and Topic Expert
Product and Topic Expert

You do not pass DEFAULT CURRENT TIMESTAMP from the client. It is part of the column definition. If you want to construct an INSERT statement that explicitly references a column and want to use its default, you pass DEFAULT as the value i.e., INSERT INTO T( ..., LogTime,... ) VALUES( ...,DEFAULT,... ). There is also a special value that is updated each time the row changes which can be useful if you want to monitor last modification.

-- sample schema showing DEFAULT CURRENT TIMESTAMP usage
CREATE OR REPLACE TABLE T(
    pk      INTEGER PRIMARY KEY DEFAULT AUTOINCREMENT,
    LogTime TIMESTAMP DEFAULT CURRENT TIMESTAMP,
    c       CHAR(50)
);
-- sample insert statements that sets DEFAULT value for LogTime
INSERT INTO t ( c ) VALUES ( 'initial value' ); 
INSERT INTO t ( LogTime, c ) VALUES ( DEFAULT, 'initial value' );
SELECT * FROM t;

-- add a column LastModified that logs last modification of the row
-- DEFAULT TIMESTAMP is modified when the row is changed i.e., INSERT, UPDATE
ALTER TABLE t ADD LastModified TIMESTAMP DEFAULT TIMESTAMP;

-- sample insert statements
INSERT INTO t ( c ) VALUES ( 'initial value' );
INSERT INTO t ( LogTime, LastModified, c ) VALUES ( DEFAULT, DEFAULT, 'initial value' );

-- LastModified will change for row with pk 2
UPDATE t SET c = 'updated value' WHERE pk = 2;
SELECT * FROM t;
VolkerBarth
Contributor

Dazu brauchst Du keinen Trigger, deklariere die Spalte einfach als DEFAULT CURRENT TIMESTAMP (oder ggf. die UTC-Variante). Analog lassen sich so der jeweilige Benutzer und auch der Zeitpunkt und Benutzer der letzten Änderung automatisch setzen. Schau in der Hilfe nach "special values".

Und weil es Defaultwerte sind, kann man sie ggf. auch überschreiben, ich mache das ab und zu aus administrativen Gründen.

0 Kudos

... das werde ich gleich ausprobieren... Danke

0 Kudos

... funktioniert, wenn man einen Datensatz z.B. mit SQL Central erzeugt. In meiner Entwicklungsumgebung hat leider der File Manager die Finger drauf, da funktioniert es nicht. Also doch Trigger verwenden...

VG Franz

VolkerBarth
Contributor
0 Kudos

Was ist mit Filemanager gemeint? Die Tabellendefinition gilt ja für jeden Zugriff. Ein Spaltendefault kommt aber nur zum Tragen, wenn beim Insert/Update kein Wert für die Spalte übergeben wird. Kann es daran liegen?

0 Kudos

... habe ich alles probiert. Meine Entwicklungsumgebung nutzt einen Native - Treiber für SQL Anywhere. Ich vermute der Treiber unterstützt DEFAULT CURRENT TIMESTAMP nicht. Ich habe im Debugger verfolgt was sich da tut. Es gibt keinen Hinweis darauf, das dieses Format erkannt wird. VG Franz

0 Kudos

Hallo zusammen, habe den folgenden Trigger angelegt um ein Datum zu updaten. Der Trigger wird aber nicht ausgeführt. Muss irgend etwas aktiviert werden? VG Franz Stampflmeier

ALTER TRIGGER "Datum Angelegt" AFTER UPDATE OF "ANGELEGT" ORDER 1 ON "dba"."Trexo_Kostentraeger" FOR EACH STATEMENT BEGIN SET Angelegt = Getdate() END

VolkerBarth
Contributor
0 Kudos

Dieser AFTER UPDATE OF Trigger wird genau dann aktiviert, nachdem ein Update erfolgt ist, das den Wert von "Angelegt" tatsächlich geändert hat. Es müsste also ein UPDATE... SET ANGELEGT = <irgendein datum="">... der Auslöser sein.

Was Du dagegen haben möchtest, ist ein BEFORE UPDATE Trigger, der den Wert direkt setzt.

Außerdem ist die Syntax für einen Statement-Level-Trigger falsch, hier müsstest Du über einen Join mit inserted erstmal die betroffenen Datensätze selektieren.

0 Kudos

... ich habe jetzt nach BEFORE UPDATE geändert, es tut sich trotzdem nichts. Frage: ist an der Stelle ein (neuer) Datensatz im Zugriff?

ALTER TRIGGER "Angelegt_Datum" BEFORE UPDATE OF "ANGELEGT" ORDER 1 ON "dba"."Trexo_Kostentraeger" FOR EACH ROW BEGIN Set Angelegt = Getdate() END

VolkerBarth
Contributor
0 Kudos

Mach einen normalen UPDATE-Trigger ohne Angabe der Spalte ((also ohne "OF Angelegt") daraus, Du möchtest ja nicht, dass der Trigger nur auslöst, wenn die Spalte Angelegt geändert wurde, sondern wenn allgemein ein Update beim Datensatz erfolgt ist. Und Du musst via REFERENCING-Klausel festlegen, mit welchem Alias Du auf den aktualisierten Datensatz zugreifen möchtest, vgl. Das Beispiel aus der Hilfe:

CREATE TRIGGER TR_update_date 
   BEFORE INSERT, UPDATE
     ON GROUPO.SalesOrderItems
   REFERENCING NEW AS new_row
FOR EACH ROW 
BEGIN
   SET new_row.ShipDate = CURRENT TIMESTAMP;
END;
0 Kudos

Ok, vielen Dank! Werde ich gleich ausprobieren...