Wenn ich mir andere Beispiele ansehe, habe ich Folgendes gefunden, aber es scheint nicht so zu funktionieren, wie ich es gerne hätte: Ich möchte, dass die geänderten Informationen nur aktualisiert werden, wenn der QtyToRepair
Wert aktualisiert wurde ... aber das funktioniert nicht Das.
Wenn ich das Wo auskommentiere, werden die geänderten Informationen in jedem Fall aktualisiert. Wie gesagt, andere Beispiele haben mich optimistisch gemacht. Alle Hinweise geschätzt. Vielen Dank.
Walter
ALTER TRIGGER [dbo].[tr_SCHEDULE_Modified]
ON [dbo].[SCHEDULE]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
UPDATE SCHEDULE SET modified = GETDATE()
, ModifiedUser = SUSER_NAME()
, ModifiedHost = HOST_NAME()
FROM SCHEDULE S
INNER JOIN Inserted I on S.OrderNo = I.OrderNo and S.PartNumber = I.PartNumber
WHERE S.QtyToRepair <> I.QtyToRepair
END
sql
sql-server
triggers
Walter de Jong
quelle
quelle
update()
- Sie testet nur, ob die Spalte in der Aktualisierungsliste angezeigt wird, und gilt immer für Einfügungen. Es wird nicht überprüft, ob sich der Spaltenwert geändert hat, da möglicherweise mehr als eine Zeile vorhanden ist, wobei sich einige Werte geändert haben und andere nicht.Antworten:
Sie haben zwei Möglichkeiten für Ihre Frage:
1- Verwenden Sie den Update-Befehl in Ihrem Trigger.
2- Verwenden Sie Join zwischen eingefügter Tabelle und gelöschter Tabelle
Wenn Sie den Befehl update für die Tabelle verwenden
SCHEDULE
und dieQtyToRepair
Spalte auf einen neuen Wert setzen und der neue Wert dem alten Wert in einer oder mehreren Zeilen entspricht, aktualisiert Lösung 1 alle aktualisierten Zeilen in der Zeitplantabelle, aber Lösung 2 aktualisiert nur Zeitplanzeilen, deren alter Wert nicht gleich neu ist Wert.quelle
inserted
Tabelle in der zweiten Abfrage? es sollte das gleiche sein wie der Tisch selbst, nicht wahr?fyi Der Code, mit dem ich endete:
quelle
WHERE S.QtyToRepair <> I.QtyToRepair AND D.QtyToRepair <> I.QtyToRepair
nie ausgelöst / abgeglichen wurden, da die ersten Kriterien nie wahr waren - die eingefügte Tabelle stimmte immer mit dem tatsächlichen Tabellenwert überein. Die Verwendung von "WHERE I.QtyToRepair <> D.QtyToRepair" war der Schlüssel für mich. Auch dieIF UPDATE (field)
Hilfe von mehreren Auslösern löst aus.Man sollte zuerst prüfen, ob
QtyToRepair
aktualisiert wird.quelle
Sie möchten Folgendes tun:
Bitte beachten Sie, dass dieser Trigger jedes Mal ausgelöst wird, wenn Sie die Spalte aktualisieren, unabhängig davon, ob der Wert gleich ist oder nicht.
quelle
Immer wenn ein Datensatz aktualisiert wurde, wird ein Datensatz "gelöscht". Hier ist mein Beispiel:
Es funktioniert gut
quelle