Проблема с триггерами в SQL-сервере заключается в том, что они называются по одному на оператор SQL - не один раз в строке.Поэтому, если ваш оператор UPDATE
обновляет 10 строк, ваш триггер называется один раз , а псевдотаблицы Inserted
и Deleted
внутри триггера содержат по 10 строк данных.
Чтобы увидеть, изменилось ли fee_earner
, я бы рекомендовал использовать этот подход вместо функции UPDATE()
:
ALTER TRIGGER [dsReplicated].[tr_mfeModified]
ON [dsReplicated].[matdb]
AFTER UPDATE
AS
BEGIN
-- I'm just *speculating* here what you want to do with that information - adapt as needed!
INSERT INTO dbo.AuditTable (Id, TriggerTimeStamp, Mt_Code, Old_Fee_Earner, New_Fee_Earner)
SELECT
i.PrimaryKey, SYSDATETIME(), i.Mt_Code, d.fee_earner, i.fee_earner
FROM Inserted i
-- use the two pseudo tables to detect if the column "fee_earner" has
-- changed with the UPDATE operation
INNER JOIN Deleted d ON i.PrimaryKey = d.PrimaryKey
AND d.fee_earner <> i.fee_earner
END
Псевдостола Deleted
содержит значения до UPDATE
- вот почему я принимаю d.fee_earner
в качестве значения для столбца Old_Fee_Earner
в таблице аудита.
Псевдо-таблица Inserted
содержит значения после UPDATE
- поэтому я беру другие значения из этой Inserted
псевдотаблицы для вставки в таблицу аудита.
Обратите внимание, что у вас действительно должен быть неизменяемый первичныйвведите эту таблицу, чтобы этот триггер работал.В любом случае это рекомендуется для любой таблицы данных в SQL Server.