Триггер TSql должен стрелять только в столбцы, значения которых изменились

Я записал триггер, который должен сделать некоторую другую работу над таблицей, на основе которой столбцы подряд на самом деле обновили. Я выполнил это использование

IF UPDATE(column-name)

Та часть хорошо работает. Оказывается, однако, что существуют другие части кода, которые обновляют строки путем устанавливания каждого значения, изменилось ли значение на самом деле или не, и это заставляет триггер стрелять для частей, которые были "обновлены", но чьи значения на самом деле не изменились вообще.

Как изменение кода это вызывает, это - вероятно, не опция, существует ли более легкий способ предотвратить это кроме необходимости выдержать сравнение между таблицами INSERTED и DELETED (в этом случае, ЕСЛИ ОБНОВЛЕНИЯ бессмысленны)?

9
задан Ryan Elkins 29 January 2010 в 18:15
поделиться

4 ответа

[
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
] [

] или объединить идеи, чтобы проверить все изменения заранее и выйти из триггера[

].
14
ответ дан 4 December 2019 в 08:00
поделиться

Как сказали другие, вы должны использовать 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, я выбираю отдельные строки, в которых интересующие меня столбцы не существуют в удаленной (или исходной) таблице (это означает, что значение этих столбцов изменилось). Я не знаю, является ли это лучшим ответом, но похоже, что это работает.

.
7
ответ дан 4 December 2019 в 08:00
поделиться
[

] Колонка была обновлена. То, что старое и новое значение были одинаковыми, - всего лишь деталь. Думаю, ваше единственное решение - сравнить значения между вставленными и удаленными псевдотаблицами.[

].
4
ответ дан 4 December 2019 в 08:00
поделиться
[

]Насколько я знаю, это не так. []INSERTED[] и []DELETED[] существуют не просто так, и сравнение между ними кажется мне лучшим вариантом.[

] [

][]IF UPDATE()[] просто сообщает Вам, была ли сделана попытка вставки или обновления []attempt[], и даже не отражает, была ли эта попытка успешной или нет.[

].
2
ответ дан 4 December 2019 в 08:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: