Wie Sie feststellen, ob ein Feld/Spalte aus, die betroffen ist, indem Sie eine UPDATE-Anweisung
Hallo an alle und danke für Eure Antworten und Kommentare.
Ich habe eine Tabelle mit mehreren Feldern, unter denen version
, last_modified
und modified_by
Ich bin writting einen Auslöser:
- erhöhen
version
um 1 nach jedem/jedem update, - set
last_modified
zu den aktuellen timestamp, - legen Sie die id des Benutzers, der zuletzt änderungen in
modified_by
, und - verhindern, dass die Programmierer von ignorieren/vergessen zu setzen
modified_by = userid
in der UPDATE-Anweisung, die durch das auslösen eines Signals (in diesem Fall).
Wie kann ich das erreichen?
Habe ich versucht, die überprüfen, ob isnull(NEW.modified_by)
, aber dann erkannte, dass NEW.modified_by
nimmt den gleichen Wert wie OLD.modified_by
wenn es nicht betroffen. Auch, überprüfen, ob NEW.modified_by
gleich OLD.modified_by
nicht ganz, denn Sie könnte ein Benutzer modifiyng ein Datensatz geändert durch sich selbst.
Gibt es eine Möglichkeit zu bestimmen, welche Felder wo betroffen von der UPDATE-Anweisung? Oder wenn ein bestimmtes Feld (modified_by
) war betroffen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nichts finden können, mit denen Sie prüfen die eingehenden Informationen, um zu sehen, welche Felder betroffen sind. Obwohl ich weiß, Sie versuchen, zu stoppen, zu diesem Thema auf der trigger-Ebene, es wäre klug, um zu verlangen, dass alle Tabelle schreibt, um an einer gespeicherten Prozedur. So könnte man verlangen, dass der Benutzer Feld.
Wenn das nicht möglich ist, denke ich, müssen Sie möglicherweise knifflig. Sie könnten zum Beispiel verlangen, dass die user_id geschrieben werden, um zwei Felder (erstellen Sie eine zusätzliche Spalte, die leer ist für diesen Zweck). Vergleichen Sie dann die user_id in der dummy-Spalte, die Sie aktualisieren möchten. Sobald Sie herausfinden, wenn Sie müssen, ändern Sie die user_id oder nicht, leeren Sie die dummy-Spalte wieder. Es ist nicht schön, aber es würde den job zu erledigen.
Hatte ich ein ähnliches Problem. Ich habe eine Tabelle mit einer tinyint-Spalte mit dem Namen isDirty, und wollte es auf 1, wenn die Zeile aktualisiert wird, und klar ist es auf 0, wenn die Zeile wurde "gereinigt".
Das problem ist, die Kombination von NEU und ALT mit den Werten 0 und 1 mir nicht genug Werte, um mein problem zu lösen. Anstatt also, ich habe eine "Regel", dass wenn die Spalte aktualisiert wurde, auf einen Wert von 100, es wurde eingestellt, um das reinigen der Wert "0" sonst setzen Sie ihn auf "1". Der Grund, warum dies funktioniert ist, dass in dieser Spalte wird immer nur einer der 2 Werte, 0 oder 1, Sie können also mit 100 (oder einen beliebigen Wert Ihrer Wahl) als "flag", das angibt, dass es sauber ist.
Ich weiß, es klingt ein wenig nach hinten, um es zu einem nicht-null-Wert wieder auf 0, aber das ist die Richtung, die ich wählte, und es funktioniert. Hier ist, was das trigger sieht wie folgt aus:
modified_by = userid
in der UPDATE-Anweisung, die durch das auslösen eines Signals (in diesem Fall). Eine Lösung wie die deine könnte leicht außer Kraft gesetzt: der Programmierer konnte einfach einfügen, 100, 0, 1, oder schlimmer noch, jede andere Zahl nicht geschafft, die (voraussichtlich), in derisDirty
Gebiet, und nichts in dermodified_by
ein. Wenn ich mich hier etwas fehlt, könnten Sie bitte näher erläutern, es?Soweit ich weiß, ist Ihre einzige option ist zu überprüfen jede Spalte den NEUEN Wert mit den ALTEN.