Есть только псевдотаблицы Inserted
и Deleted
- Updated
нет.
Для UPDATE
, Inserted
содержит новые значения (после обновления), в то время как Deleted
содержит старые значения до обновления.
Также следует помнить , что триггеры срабатывают один раз за пакет - не один раз для каждой строки.Таким образом, обе псевдотаблицы могут содержать несколько строк !Не просто примите одну строку и присвойте ее переменной - это
SELECT @statusOldValue = statusCode FROM deleted
SELECT @statusNewValue= statusCode FROM updated
завершится ошибкой , если у вас несколько строк!Вы должны написать свои триггеры таким образом, чтобы они работали с несколькими строками в Inserted
и Deleted
!
Обновление: да - там IS гораздо лучший способ написать это:
ALTER TRIGGER [dbo].[trg_SourceHistory] ON [dbo].[tblSource]
FOR UPDATE
AS
INSERT INTO dbo.tblHistoryTable(Col1, Col2, Col3, ...., ColN)
SELECT Col1, COl2, Col3, ..... ColN
FROM Deleted d
INNER JOIN Inserted i ON i.PrimaryKey = d.PrimaryKey
WHERE i.statusCode <> d.statusCode
AND d.statusCode IN ('A', 'P')
В основном:
явно указать столбцы, которые вы хотите вставить - оба в INSERT
оператор, а также оператор SELECT
, извлекающий данные для вставки - чтобы избежать неприятных сюрпризов
создайте INNER JOIN
между Inserted
и Deleted
псевдотаблицами дляполучить все строки, которые были обновлены
указать все другие условия (различные коды состояния и т. д.) в предложении WHERE
SELECT
Это решение работает для обновляемых пакетов строк - оно не будет работать при многострочном обновлении ....