Hallo in das Forum,
mein Name ist Frank und starte gerade meine ersten Schritte mit Postgres, und mit SQL
Die ersten Schritte um meine ‘alten’ DBF zu konvertieren und meine Programme anzupassen sind bis jetzt recht erfolgreich. Nun bin ich bei Triggern gelandet und hänge da an einem Problem, wo ich keine Lösung finde.
Ich möchte ein Audit Trigger erstellen, wo ich nur die tatsächlichen Änderungen mitspeichere. Mein Vorgehen bisher ist bis jetzt, die Tabellenstrukture auslesen und jeden Inhalt in der NEW und OLD vergleichen. Ist dieser unterschiedlich, später ein Text bilden der gespeichert wird.
Wie kann ich z.B. anstatt:
NEW.COL1 != OLD.COL1
ersetzen im LOOP mit dem Spaltennamen aus columns?
CREATE OR REPLACE FUNCTION public.adressen_update()
RETURNS trigger AS
$BODY$
DECLARE
columns RECORD;
n char(500);
o char(500);
BEGIN
FOR columns IN select column_name from information_schema.columns where table_name=TG_TABLE_NAME::TEXT
LOOP
n=‘NEW.’||columns.column_name; /// hier ist mein Problem, ich möchte jeden Wert vergleichen, und diesen dann in changes speicher.
o=‘OLD.’||columns.column_name;
if (n != o)
THEN
INSERT INTO auditlog (tablename,username,creation,action,changes)
VALUES (TG_TABLE_NAME::TEXT,session_user::TEXT,now(),TG_OP,n);
END IF;
END loop;
RETURN NEW;
return NEW;
EXCEPTION
WHEN data_exception THEN
RAISE WARNING ‘[AUDIT.IF_MODIFIED_FUNC] - UDF ERROR [DATA EXCEPTION] - SQLSTATE: %, SQLERRM: %’,SQLSTATE,SQLERRM;
RETURN NULL;
WHEN unique_violation THEN
RAISE WARNING ‘[AUDIT.IF_MODIFIED_FUNC] - UDF ERROR [UNIQUE] - SQLSTATE: %, SQLERRM: %’,SQLSTATE,SQLERRM;
RETURN NULL;
WHEN OTHERS THEN
RAISE WARNING ‘[AUDIT.IF_MODIFIED_FUNC] - UDF ERROR [OTHER] - SQLSTATE: %, SQLERRM: %’,SQLSTATE,SQLERRM;
RETURN NULL;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION public.adressen_update()
OWNER TO postgres;
Danke für eure Hilfe,
Frank