Hallo!
Habe folgendes Problem mit einem History-Trigger, welcher mir den alten und den neuen Wert der aktualisierten Spalten in eine extra dafür vorgesehene Tabelle (“historytabelle”) schreiben soll.
Mein Problem dabei ist, dass ich die jeweiligen Spalten per SQL-Statement erst beim Ausführen des Triggers zur Laufzeit aus den Systemtabellen hole und dann in der Schleife vergleiche, ob der alte Wert != dem neuen Wert.
Den Trigger habe ich in plpgsql geschrieben.
Er wird jeweils beim UPDATE auf die jeweilige Tabelle ausgeführt.
Aufbau der History-Tabelle, in die nur geänderten Spalten mit je einem Datensatz eingefügt werden sollen:
tabelle character varying
spalte character varying
wert_alt character varying
wert_neu character varying
zeit timestamp
Inhalt meines History-Triggers:
declare
spalten record;
spaltenname varchar;
wert_old varchar;
wert_new varchar;
BEGIN
for spalten in SELECT spaltenname as sn ROM systemtabelle
loop
spaltenname := spalten.sn;
wert_old := OLD.spaltenname;
wert_new := NEW.spaltenname;
IF (wert_new != wert_old) THEN
insert into historytabelle
(tabelle, spalte, wert_alt, wert_neu, zeit)
values
(‘Tabellenname’, spaltenname, wert_old, wert_new, current_timestamp);
END IF;
END loop;
RETURN new;
END;
Beim Ausführen dieses Triggers erhalte ich immer folgende Fehlermeldung, da der Inhalt von “wert_old” bzw. “wert_new” nicht ausgewertet werden kann & somit nach einer Spalte “spaltenname” in der jeweiligen Tabelle gesucht wird.
Warning: pg_exec() [function.pg-exec]: Query failed: ERROR: record “old” has no field “spaltenname” CONTEXT: PL/pgSQL function “hallo” line 17 at assignment in … .
Wenn ich im Trigger knall hart ne Spalte eintrage, die ich auch per Schleife zurück bekomme, läuft er ohne Fehler sauber durch. Ich habe, wie gesagt, halt “NUR” das Problem, dass ich hinter OLD. bzw. NEW. die Variable spaltenname nicht sauber aufgelöst werden kann.
Und das Zusammenkonkatinieren wert_old := OLD.spalten.sn; geht ja nunmal leider nicht…
wert_old := OLD.status;
wert_new := NEW.status;
Hat jemand eine Idee?
Vielen Dank.
easyrider1203