Wie finde ich heraus welche Spalten von einem Update betroffen sind?

Hallo zusammen!

Ich bin gerade dabei einen Trigger zu schreiben, mit dem ich herausfinden kann welche Spalten eines Records geändert wurden. MS SQL Server bietet da die Funktion COLUMNS_UPDATED() an, mit der man herausfinden kann welche Columns geändert wurden. Habe jetzt wirklich lange in Büchern geschaut (und natürlich auch bei google) aber habe leider nichts passendes gefunden.
Hat hier vielleicht jemand eine Idee oder weiß ob es eine ähnliche Funktion in postgreSQL gibt?

Mfg Petro

coalesce(NEW.column::text, ‘’) <> coalesce(OLD.column::text, ‘’)

hmm

Erst mal danke. Habe es gerade mal ausprobiert und es sieht gar nicht schlecht aus. Jetzt ist nur noch das Problem da, das meine Tabelle 70 Columns enthält und daher eine Abfrage für jede einzelne Spalte extrem viel Code erzeugen würde. Gibt es eine Möglichkeit zur Laufzeit den Spaltennamen von NEW zu setzen? Habe nämlcih bereits in einem VARCHAR Array alle Spaltennamen der Tabelle.

Also irgendwas in der Art hier:
DECLARE
res text;

FOR i IN 0…(colcount-1) LOOP
temp = ‘"’||Columns_||’"’; --Mein Array mit den Spaltennamen

EXECUTE ‘SELECT NEW.’ || temp || ’ INTO res’; --Hier würde ich jetzt gern den Text der Spalte in einer Variable speichern
END LOOP;

Bekomme dann aber leider folgenden Fehler: ERROR: NEW used in query that is not in a rule_

NEW und OLD sind lokale Variablen einer Pq/PLSQL-Triggerfunktion.

Die setzt man nicht in Quotas …

Mir ist nicht bekannt, dass man auf einfachem Wege mal eben alle mehr oder minder unbekannten Attribute zwischen OLD und NEW auf Änderung prüfen kann.

Brauchst Du das wirklich? Oder sind das Flausen der allgemein willkommenen Bequemlichkeit :slight_smile:

Wäre halt schön gewesen, da ich eine andere Tabelle habe, in die Änderungen geschrieben werden sollen, wenn etwas in der “Main”-Tabelle geändert wurde. Und dort hätte ich gerne stehen gehabt um welche Spalte es sich handelt und welcher Wert vor und nach einem UPDATE drinsteht. Aber jede Spalte manuell miteinander zu vergleichen ist mir definitv zu aufwending :wink:

Trotzdem Vielen Dank

Für soetwas hat ads ne Lösung - lautet glaube ich table log - google findet alles

Sehr schön das scheint genau das zu sein was ich Suche. Werde gleich mal ausprobieren ob ich es damit hinbekommen.

Vielen Dank Petro

Habe es mir jetzt mal runtergeladen und ein bischen angeschaut. Scheint mir aber so wie wenn man als OS Linux benötigen würde, weil mit der Anleitung kann ich als Windows-User leider nicht viel anfangen. Hat zufällig irgendjemand schonmal mit Table Log unter Windows gearbeitet?

Mfg Petro

Hat mal jemand, allerdings habe ich keine Binaries mehr dafür zur Verfügung.
Mit einem Compiler solltest du das allerdings hinbekommen.

es geht iirc in plperl. Also, falls Du mit Perl nicht verfeindet bist, dann schaue dir das mal an.

Andreas