Проблема с триггером 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 пункт...

Другие вопросы по тегам