mysql Trigger für die Protokollierung, finden die geänderten Spalten
Schreibe ich einen trigger, um zu verfolgen alle änderungen, die in diesem Fall in eine Tabelle. Leider ist die Tabelle hat 150+ Spalten und das wollte ich vermeiden zu schreiben, die jede Spalte in der code (BSP. neue.col1, neue.col2....) und so schrieb ich folgende Abfrage in "after update-trigger"
INSERT INTO logs SELECT *, NOW() FROM abc WHERE abc.id = NEW.Id;
Diese Idee verursacht mehrere Ausgabe durch Vervielfältigung der Daten, die nicht geändert im update-Abfrage.
In aller Kürze möchte ich dynamisch feststellen, welche Spalten waren Teil der update-Abfrage und wenn das nicht möglich ist, gibt es eine Möglichkeit zum iterieren durch alle Spalten der "neuen" Zeile, so kann ich dynamisch vergleichen old.@colName == new.@colName?
Habe ich schon gesehen
Oracle PL/SQL: Schleife Über Trigger Spalten Dynamisch, Wie Sie feststellen, ob sich etwas geändert im update-trigger in t-sql und MySQL-UPDATE-trigger: Einsetzen der Werte der Spalten, die tatsächlich geändert wurden.
Den letzten link-das schließt an das, was ich brauche, nur mit einem Unterschied, ich will nicht zu hart code-Spalte-Namen in der folgenden Aussage, denn ich habe über 100+ Spalten in allen Tabellen, die ich schreiben werde, um ähnliche Auslöser für!!
IF NEW.column1 <> OLD.column1 THEN INSERT INTO... END IF; IF NEW.column2 <> OLD.column2 THEN INSERT INTO... END IF
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich ve wurde dabei ein wenig Forschung auf dieses morgen und sieht aus wie ich haben viel von der gleichen such-Ergebnisse wie Sie. Letztlich sieht es für mich wie es gibt keinen Weg, um eine Schleife über alle Spalten der Tabelle und verweisen die entsprechenden alten/neuen Werte. Ich bin die Festlegung auf explizit überprüfen jede Spalte und dann die Protokollierung:
Fand ich eine Ahnung von einer anderen Lösung hier. In der Theorie könnten Sie haben 3 getrennte Liste der Spaltennamen, eine für alte vals und eine für die neuen vals. Sie hätte expliziter Verweis auf die alten und neuen vals, aber das wäre eine Zeile (einfacher zu pflegen oder kopieren/paste, um eine Umsetzung auf andere Tabellen) und Sie können dann die Schleife. Also in pseudo-code würde es z.B. so Aussehen:
Ich habe nicht gedacht, dass dieser durch zu viel. Sie müssen möglicherweise zum aufrufen einer gespeicherten Prozedur anstatt Variablen festlegen. Aber es könnte sein, lohnt ein Blick in. Ich habe lange genug auf meinem löst sich schon. Nicht sicher, ich könnte überprüfen (zu meinem Chef) trial-and-error-Zeit auf eine elegantere Lösung.
Als ingratiatednerd bereits vorgeschlagen, die Sie verwenden können, CONCAT_WS, um strings aus aller erforderlichen Werte und machen Sie einen einzigen compare-Anweisung.
Vielleicht die folgende ist nützlich, um jemanden: