Проверьте, идентичны ли вставленные и удаленные таблицы в триггере SQL Server
Я написал триггер, чтобы сохранить историю обновлений в таблице. Работает хорошо. Однако я заметил, что иногда таблица обновляется с такими же точными значениями. Это эффективно не меняет таблицу, но запускает триггер, что приводит к дублированию строк в моей таблице истории.
Чтобы решить эту проблему, я хотел бы выполнить тело моего триггера только когда inserted
а также deleted
таблицы не идентичны.
Вот мой текущий триггер. Он состоит из MERGE и INSERT. Если inserted
а также deleted
таблицы идентичны, я не хочу ни MERGE, ни INSERT:
BEGIN
DECLARE @yesterday date, @maxDate date
SET @yesterday = DATEADD(DD, -1, GETDATE())
SET @maxDate = '9999-12-31'
MERGE dbo.tblHistory AS Target
USING (SELECT * FROM inserted) AS Source
ON (Target.ID = Source.ID AND Target.EndDate = @maxDate)
WHEN MATCHED AND Target.StartDate > @yesterday THEN
DELETE
WHEN MATCHED THEN
UPDATE
SET Target.EndDate = @yesterday
;
--Insert updated row into History here
END
Это кажется наиболее понятным и логичным способом сделать это. Однако я не уверен, что это наиболее эффективно.
1 ответ
Решение
Вы можете проверить, используя, кроме оператора, как показано ниже
;with cte
as
(SELECT * FROM inserted
EXCEPT
SELECT * FROM deleted
union all
SELECT * FROM deleted
EXCEPT
SELECT * FROM inserted
)
select * from cte
if @@rowcount>0
begin
--rest of your query
end