Я думаю, вы должны научиться использовать merge
, а не делать эту логику в триггере. Тем не менее, ваш вопрос о том, как заставить работать триггер. Вам нужен триггер, который заменяет вставку, а не запускается после нее.
Вам нужно сделать вставку внутри триггера . Это выглядит так:
ALTER TRIGGER MyTrigger ON persons INSTEAD OF INSERT
AS
BEGIN
-- Insert person ids that are new
INSERT INTO persons
SELECT i.*
FROM inserted i
WHERE NOT EXISTS (SELECT 1
FROM persons p
WHERE i.PersonID = p.PersonID
);
-- update existing person ids
UPDATE p
SET p.LastName = i.LastName,
p.FirstName = i.FirstName,
p.address = i.address,
p.City = i.City
FROM persons p INNER JOIN
inserted i
ON p.PersonID = i.PersonID
WHERE p.LastName <> i.LastName OR
p.FirstName <> i.FirstName OR
p.address <> i.address OR
p.City <> i.City;
END; -- MyTrigger
Я оставил условия сравнения, которые у вас есть, хотя я не думаю, что они верны. Вы должны быть очень осторожны с NULL
значениями. Если какое-либо из старых или новых значений равно NULL
, то UPDATE
не будет.