我写了一个触发器来保存表中的更新历史记录。它运作良好。但是,我注意到有时会使用相同的确切值更新表。这实际上不会更改表但会触发触发器,从而导致我的历史记录表中出现重复的行。
要解决此问题,我只想在inserted
和deleted
表不相同时执行触发器的主体。
这是我当前的触发器。它由MERGE和INSERT组成。如果inserted
和deleted
表相同,我不想合并也不要插入:
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
这似乎是最容易阅读和合理的方式。但是,我不确定它是否最有效。
答案 0 :(得分:3)
您可以使用下面的<运算符
进行检查 ;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