Änderungstabelle via Trigger + Funktion

Hallo,

ich habe vor Änderungen, die in einer Tabelle “A” vorgenommen werden, auch in eine andere Tabelle “A_REVISION” zu übertragen (bei erstmaliger Eintragung UND bei einem Update).
Dabei möchte ich einen Trigger und eine in der Sprache SQL geschriebene Funktion verwenden.
Den Trigger setze ich auf Tabelle “A” an.

Hier ein Beipiel:

Tabelle A

[TABLE=“width: 500”]
[TR]
[TD]ID[/TD]
[TD]Zeit[/TD]
[TD]Wert1[/TD]
[TD]Wert2[/TD]
[TD]Wert3[/TD]
[/TR]
[TR]
[TD]1[/TD]
[TD]2012-01-18 12:00:00.000[/TD]
[TD]1[/TD]
[TD]2[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]2[/TD]
[TD]2012-01-18 12:01:00.000[/TD]
[TD]1[/TD]
[TD]2[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]3[/TD]
[TD]2012-01-18 12:01:02.000[/TD]
[TD]1[/TD]
[TD]2[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]4[/TD]
[TD]2012-01-18 12:01:05.000[/TD]
[TD]1[/TD]
[TD]2[/TD]
[TD]3[/TD]
[/TR]
[/TABLE]

Tabelle A.REVISION (Trigger hat alle erstmaligen INSERTS auf Tabelle A auch auf Tabelle A.REVISION übertragen)

[TABLE=“width: 500”]
[TR]
[TD]ID[/TD]
[TD]Zeit[/TD]
[TD]Wert1[/TD]
[TD]Wert2[/TD]
[TD]Wert3[/TD]
[/TR]
[TR]
[TD]1[/TD]
[TD]2012-01-18 12:00:00.000[/TD]
[TD]1[/TD]
[TD]2[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]2[/TD]
[TD]2012-01-18 12:01:00.000[/TD]
[TD]1[/TD]
[TD]2[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]3[/TD]
[TD]2012-01-18 12:01:02.000[/TD]
[TD]1[/TD]
[TD]2[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]4[/TD]
[TD]2012-01-18 12:01.05.000[/TD]
[TD]1[/TD]
[TD]2[/TD]
[TD]3[/TD]
[/TR]
[/TABLE]


Jetzt wird ein Update auf Tabelle “A” ausgeführt, damit sie wie Folgt geändert wird:
(UPDATE A SET Wert1=2 WHERE ID=1)


[TABLE=“width: 500”]
[TR]
[TD]ID[/TD]
[TD]Zeit[/TD]
[TD]Wert1[/TD]
[TD]Wert2[/TD]
[TD]Wert3[/TD]
[/TR]
[TR]
[TD]1[/TD]
[TD]2012-01-18 14:27:01.000[/TD]
[TD]2[/TD]
[TD]2[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]2[/TD]
[TD]2012-01-18 12:01:00.000[/TD]
[TD]1[/TD]
[TD]2[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]3[/TD]
[TD]2012-01-18 12:01:02.000[/TD]
[TD]1[/TD]
[TD]2[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]4[/TD]
[TD]2012-01-18 12:01:05.000[/TD]
[TD]1[/TD]
[TD]2[/TD]
[TD]3[/TD]
[/TR]
[/TABLE]

und jetzt soll der Trigger im Idealfall nur die Änderungen in die Tabelle “A_REVISION” überrtagen:


[TABLE=“width: 500”]
[TR]
[TD]ID[/TD]
[TD]Zeit[/TD]
[TD]Wert1[/TD]
[TD]Wert2[/TD]
[TD]Wert3[/TD]
[/TR]
[TR]
[TD]1[/TD]
[TD]2012-01-18 12:00:00.000[/TD]
[TD]1[/TD]
[TD]2[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]2[/TD]
[TD]2012-01-18 12:01:00.000[/TD]
[TD]1[/TD]
[TD]2[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]3[/TD]
[TD]2012-01-18 12:01:02.000[/TD]
[TD]1[/TD]
[TD]2[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]4[/TD]
[TD]2012-01-18 12:01.05.000[/TD]
[TD]1[/TD]
[TD]2[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]1[/TD]
[TD]2012-01-18 14:27:01.000[/TD]
[TD]2[/TD]
[TD][/TD]
[TD][/TD]
[/TR]
[/TABLE]


kann man soweit nachvollziehen, was ich vorhabe?
Könnte mir jemand dabei helfen?
Wäre sehr Dankbar für jeden Codeschnipsel, den ich dazu gebrauchen kann.
Wenn doch die Ganze Zeile in die Tabelle A_REVISION übertragen wird, ist es halt so.

Soweit bin ich bis jetzt:

CREATE FUNCTION “FUNC_A_REVISION”()
LANGUAGE sql
VOLATILE
AS
$$
BEGIN

END
$$
;

[INDENT]

CREATE TRIGGER “TG_A_REVISION”
BEFORE INSERT OR UPDATE
ON “A” FOR EACH ROW
EXECUTE PROCEDURE FUNC_A_REVISION()
;

[/INDENT]
[INDENT]
[/INDENT]



Gruß, Torsten

Log Table Changes in PostgreSQL with tablelog - ads’ corner

Andreas

Hallo Andreas,

danke für die schnelle Antwort.
Ich habe diese Seite schon gefunden (google) und muss sagen:
Das ist alles viel zu kompliziert und undurchsichtig.

Damit komm ich nicht klar.
Würde es auch ausschließlich mittels einer Funktion, geschrieben in Language SQL, möglich sein?

Gruß, Torsten

Das kannst Du gern probieren - und dem ads auch dann mitteilen, wie es einfacher geht, er freut sich da bestimmt über Anregungen.


Andreas

smile

Also in SQL selbst wirst du das voraussichtlich gar nicht hinbekommen.
In pl/pgSQL ist das mit einigem Aufwand und viel Skripterei möglich.
An dem Status hat sich seit rund 13 Jahren nichts geändert, seit ich tablelog damals angefangen habe zu entwickeln.