У меня есть триггер таблицы на UPDATE и INSERT, который добавляет строку в другую таблицу. Нужно только добавить строку, если один из четырех столбцов изменился. Я попытался использовать IF UPDATE (col) для проверки изменений, но у него есть слепое пятно. Это только проверяет, что вошло какое-то значение. Мне нужно пойти глубже, мне нужно сравнить старые и новые значения, чтобы увидеть, произошло ли истинное изменение. Он должен работать как с INSERT, так и с UPDATE.
В случае ОБНОВЛЕНИЯ это просто, потому что и во вставленной, и в удаленной таблице есть значения, которые я могу сравнить в триггере. Однако для INSERT только таблица вставки имеет значения. Поскольку мне нужно все это в одном и том же триггере, как мне обработать этот случай INSERT?
Вот скрипт триггера, который я хочу изменить:
ALTER TRIGGER [dbo].[trATPerson_alter]
ON [mydb].[dbo].[AT_Person]
AFTER INSERT,UPDATE
AS
BEGIN
SET NOCOUNT ON;
-- Not all updates require a push
IF (UPDATE([First_Name]) OR UPDATE([Last_Name]) OR UPDATE([JobCode]) OR UPDATE([Inactive]))
BEGIN
INSERT INTO [mydb].[dbo].[AT_Person_To_Push] (
[Facility],
[VendorID],
[Person_code],
[First_Name],
[Last_Name],
[JobCode],
[Alink],
[Inactive]
)
SELECT [Facility],
[VendorID],
[Person_code],
[First_Name],
[Last_Name],
[JobCode],
[Alink],
[Inactive]
FROM inserted
END
END
Ответы:
Вы можете обрабатывать как INSERT, так и UPDATE с помощью оператора EXCEPT set. EXISTS будет оценивать как TRUE, только если это просто INSERT, или если это UPDATE с разными значениями для любого из этих столбцов.
источник
EXISTS
проверяет, что любая строка изменилась. Если вы удерживаете вставку в вопросе, вы будете регистрировать все обновленные строки, когда только одна из них будет содержательно изменена.Если обновление может повлиять на несколько строк, вы должны защититься от двух вещей:
AT_Person_To_Push
. Если 5 строк обновлены, но только 2 обновлены так, как нам нужно, то нам нужно обработать только 2 соответствующие строки.Вот как бы я справился с этим:
inserted
сdeleted
, потому чтоinserted
будут иметь строки для вставок и обновлений, в то время какdeleted
будут только строки для обновлений.EXISTS
с,EXCEPT
чтобы найти строки, гдеinserted
значения отличаются отdeleted
значений. Вы не можете использовать,i.First_Name != d.First_Name OR i.Last_Name != d.Last_Name...
потому что удаленная таблица будет пустой (и LEFT JOIN вернет нули), когда триггер обрабатывает INSERT.AT_Person_To_Push
.источник
Попробуй это,
источник