Проблема с триггером UPDATE
У меня есть приложение для отслеживания запасов, в котором я также отслеживаю изменения запасов для каждого местоположения. Предметы инвентаря могут находиться в нескольких местах. Это достигается за счет наличия базы данных отслеживания и использования триггера в моей таблице инвентаря. Триггер работает должным образом, если я изменяю количество предмета один раз. Если я вернусь и снова изменю количество для того же местоположения, все количества для этого местоположения (только) обновятся с тем же количеством. Вот мой триггер:
INSERT tblInvTracking(keyProductID, fldLocationId, fldLastPhysical, fldQuantity, fldInventoryChange, fldNewQuantity)
SELECT D.keyProductID, I.fldLocationID, D.fldLastPhysical, d.fldQuantity, i.fldLastPhysical, i.fldQuantity
FROM DELETED D
JOIN INSERTED I ON D.keyProductID = I.keyProductID
WHERE D.fldLastPhysical <> i.fldLastPhysical AND d.fldLocationID = i.fldLocationID;
UPDATE tblInvTracking
SET fldNewQuantity = (SELECT inserted.fldQuantity FROM inserted)
FROM deleted d
JOIN inserted i ON D.keyProductID = I.keyProductID
WHERE d.fldLastPhysical = i.fldLastPhysical AND tblInvTracking.keyProductID = i.keyProductID AND tblInvTracking.fldLocationID = i.fldLocationID;
Поскольку мой оператор INSERT выполняется правильно, я знаю, что предложение WHERE работает. Проблема должна быть в моем предложении UPDATE WHERE, которое, похоже, игнорирует d.fldLastPhysical = i.fldLastPhyiscal.
ПРИМЕЧАНИЕ. Триггер - это триггер "ON UPDATE" моей таблицы инвентаря. Когда я изменяю количество определенной детали в определенном месте в определенную дату, триггер вставляет новую запись в таблицу отслеживания. Если количество затем изменится, в этой части в этом месте на эту дату не будет создана новая запись. Это то, что делает предложение where в операторе вставки, и это работает.
Я хочу, чтобы количество было изменено в тот же день в том же месте, чтобы количество в таблице отслеживания обновлялось на эту дату. Похоже, что D.fldLastPhysical <> i.fldLastPhysical работает, а d.fldLastPhysical = i.fldlastPhysical - нет. Единая часть для определенного местоположения обновляется для всех дат.
Приношу свои извинения, если это было непонятно, но мне нужно было понять ваш ответ и обработать результаты. Итак, это предложение where в операторе обновления работает неправильно.
благодаря
2 ответа
Я изменил предложение where, чтобы d.fldLastPhysical использовал сегодняшнюю дату, что позволило решить проблему. По-видимому, что-то происходит с i.fldLastPhysical, из-за моей первоначальной проблемы.
Спасибо за обратную связь, Марк.
Вы делаете классическую ошибку, полагая, что
Inserted
псевдотаблица в
UPDATE
триггер будет содержать только одну строку - это очень часто НЕ бывает!
Взгляните на этот код:
UPDATE tblInvTracking
SET fldNewQuantity = (SELECT inserted.fldQuantity FROM inserted)
********************************************
FROM deleted d
JOIN inserted i ON D.keyProductID = I.keyProductID
Если ваш
UPDATE
операция влияет на 10 строк - как вы думаете, какая из них будет использоваться для получения
inserted.fldQuantity
значение?? Он недетерминирован - один будет использоваться, все остальные игнорируются. Что вдвойне печально, поскольку вы уже получаете доступ
Inserted
и
Deleted
в запросе правильным образом на основе набора.
Так почему ты просто не использовал это??
UPDATE it
SET fldNewQuantity = i.fldQuantity
FROM inserted i
INNER JOIN tblInvTracking it ON it.keyProductID = i.keyProductID
AND it.fldLocationID = i.fldLocationID;
Поскольку вы не имеете в виду ничего из
Deleted
псевдотаблица - зачем вообще включать ее в
UPDATE
? Также: определите условие соединения между
Inserted
и
tblInvTracking
в собственном
INNER JOIN
а не с
WHERE
пункт...