SQL Server After Update-Trigger Funktioniert Nicht
habe ich schema mit der folgenden Struktur;
In MPRMain
Tabelle, die Status
werden kann 1(Genehmigen), 2(Abbrechen) und 3(Pending). Ich versuche, so etwas zu tun.e.g Wenn jemand aktualisieren Status
(in MPRMain) zu 2(Abbrechen). Ich will Update das Status
einer MPRDetail
Tabelle 0 (0 zum deaktivieren und 1 zum aktivieren).
So, ich habe versucht, einen trigger erstellen, die wie folgt aussieht;
Alter Trigger Inventory.MprMainUpdate
ON Inventory.MPRMain
AFTER UPDATE
AS
BEGIN
declare @status as int;
set @status = (SELECT Status FROM inserted);
if(@status=2)
BEGIN
UPDATE Inventory.MPRDetail
SET Status = 0 -- update the status to canceled
WHERE MPRId = (select MPRId from inserted);
END
END
Jedoch, Wenn ich versuche, um die Status
einer MPRMain
zu 2 (Abbrechen) Von 1 (Genehmigen), ich sehe keine änderungen in MPRDetail
Tabelle. Dies sollte aktualisieren Sie die MPRDetail
Status 0 (0 für deaktivieren).
- Ihr erstes problem ist, dass Sie falsch unter der Annahme, dass der trigger aufgerufen wird einmal pro Zeile - ist es nicht. Es heißt einmal pro Anweisung und Ihre
Inserted
Tabelle kann (und wird!) enthalten mehrere Zeilen - so das man Sie wählen Sie mitset @status = (SELECT Status FROM inserted);
- dies ist nicht definiert. Sie müssen schreiben Sie Ihre trigger zu berücksichtigen, dassInserted
(undDeleted
) werden enthalten mehrere Zeilen! Sie muss um diese mit einen set-basierten Ansatz - jedes Beispiel, das von Euch geschätzt wird. Ich havn ' T verwendet Trigger vor.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Seit
Inserted
enthalten mehrere Zeilen, die Sie schreiben müssen die trigger mit einem set-basierte Ansatz:Also im Grunde, Sie müssen sich Ihres eigentlichen Daten-Tabelle gegen die
Inserted
pseudo-Tabelle basierend auf derMPRId
Spalte, und aktualisieren Sie alle Zeilen in der Basistabelle zuStatus = 0
woInserted.Status = 2
OK - hier gehe ich: vorausgesetzt, Ihr
UPDATE
- Anweisung aktualisiert vier Zeilen, dannInserted
Aussehen könnte, wie diese in Ihr auslösen:Nun, Sie
JOIN
dieser Satz von Daten gegen IhreMPRDetail
Tisch und Sie nur wählen Sie diejenigen Zeilen, in denen dieStatus
imInserted
2 - so bekommen SieSo, in diesem Fall werden sowohl die Zeilen in
MPRDetail
würde IhrStatus
aktualisiert, 0 innerhalb der trigger - alle anderen Zeilen werden nicht berührt.Macht die Dinge ein wenig klarer? Wenn nicht: wo sind Sie stecken, was noch "magic" und so unklar für dich?