У меня есть таблица под названием dsReplicated.matDB и столбец fee_earner. Когда этот столбец обновляется, я хочу записать две части информации:
из строки, в которой был обновлен fee_earner.
У меня есть базовый синтаксис для выполнения каких-либо действий, когда столбец обновляется, но мне нужна рука с указанным выше, чтобы передать это через строку.
ALTER TRIGGER [dsReplicated].[tr_mfeModified]
ON [dsReplicated].[matdb]
AFTER UPDATE
AS
BEGIN
IF (UPDATE(fee_earner))
BEGIN
print 'Matter fee earner changed to '
END
END





Проблема с триггерами в 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.
Спасибо за это абсолютно блестяще - на самом деле концепция псевдотаблиц Inserted и Deleted была для меня совершенно новой, поэтому я не понимал, как она будет работать, пока не попробовал. Очень рад этому, еще раз спасибо.
Кроме того, функции UPDATE в триггере не важно, изменилось ли значение, только то, что столбец является частью оператора обновления.