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

asked 22 Jan, 03:53

Franz_Stf's gravatar image

Franz_Stf
1425813
accept rate: 0%

edited 24 Jan, 11:16

JBSchueler's gravatar image

JBSchueler
2.9k21254


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;
permanent link

answered 22 Jan, 15:26

Chris%20Keating's gravatar image

Chris Keating
6.5k41109
accept rate: 29%

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.

permanent link

answered 22 Jan, 05:11

Volker%20Barth's gravatar image

Volker Barth
38.5k349525795
accept rate: 34%

edited 22 Jan, 05:15

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

(22 Jan, 06:36) Franz_Stf

... 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

(22 Jan, 06:57) Franz_Stf
Replies hidden

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?

(22 Jan, 08:39) Volker Barth

... 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

(22 Jan, 10:01) Franz_Stf

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

permanent link

answered 18 Feb, 05:05

Franz_Stf's gravatar image

Franz_Stf
1425813
accept rate: 0%

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.

(18 Feb, 06:47) Volker Barth

... 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

(18 Feb, 07:38) Franz_Stf
Replies hidden

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;
(18 Feb, 07:53) Volker Barth

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

(18 Feb, 09:05) Franz_Stf
Your answer
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link:[text](http://url.com/ "title")
  • image?![alt text](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Question tags:

×177

question asked: 22 Jan, 03:53

question was seen: 250 times

last updated: 18 Feb, 09:05