Я записал триггер, который должен сделать некоторую другую работу над таблицей, на основе которой столбцы подряд на самом деле обновили. Я выполнил это использование
IF UPDATE(column-name)
Та часть хорошо работает. Оказывается, однако, что существуют другие части кода, которые обновляют строки путем устанавливания каждого значения, изменилось ли значение на самом деле или не, и это заставляет триггер стрелять для частей, которые были "обновлены", но чьи значения на самом деле не изменились вообще.
Как изменение кода это вызывает, это - вероятно, не опция, существует ли более легкий способ предотвратить это кроме необходимости выдержать сравнение между таблицами INSERTED и DELETED (в этом случае, ЕСЛИ ОБНОВЛЕНИЯ бессмысленны)?
IF EXISTS (SELECT *
FROM
INSERTED I JOIN DELETED D ON I.Key = D.Key
WHERE
I.Col <> D.Col)
...
]
[] или использовать табличный параметр для кэширования, чтобы избежать повторного использования I и D.[
] [SELECT
CASE WHEN I.Col1 <> D.Col1 THEN 1 ELSE 0 END AS Col1Diff,
CASE WHEN I.Col2 <> D.Col2 THEN 1 ELSE 0 END AS Col2Diff,
...
FROM
INSERTED I JOIN DELETED D ON I.Key = D.Key
]
[] или объединить идеи, чтобы проверить все изменения заранее и выйти из триггера[
]. Как сказали другие, вы должны использовать INSERTED
и DELETED
таблицы.
Вот что я сделал вместо :
IF UPDATE(col1) OR UPDATE(col2))
UPDATE table1
SET col3 = 1
FROM INSERTED
WHERE table1.Id = INSERTED.Id
Я сделал:
IF UPDATE(col1) OR UPDATE(col2))
UPDATE table1
SET col3 = 1
FROM
(SELECT Id, col1, col2 FROM INSERTED
EXCEPT
SELECT Id, col1, col2 FROM DELETED) AS ALTERED
WHERE table1.Id = ALTERED.Id
Используя EXCEPT
, я выбираю отдельные строки, в которых интересующие меня столбцы не существуют в удаленной (или исходной) таблице (это означает, что значение этих столбцов изменилось). Я не знаю, является ли это лучшим ответом, но похоже, что это работает.
] Колонка была обновлена. То, что старое и новое значение были одинаковыми, - всего лишь деталь. Думаю, ваше единственное решение - сравнить значения между вставленными и удаленными псевдотаблицами.[
].]Насколько я знаю, это не так. []INSERTED[
] и []DELETED[
] существуют не просто так, и сравнение между ними кажется мне лучшим вариантом.[
][]IF UPDATE()[
] просто сообщает Вам, была ли сделана попытка вставки или обновления []attempt[], и даже не отражает, была ли эта попытка успешной или нет.[