【发布时间】:2017-09-15 16:02:28
【问题描述】:
我编写了一个触发器来将更新历史记录保存在一个表中。它运作良好。但是,我注意到有时该表会使用相同的确切值进行更新。这实际上不会更改表,但会触发触发器,从而导致我的历史表中出现重复的行。
为了解决这个问题,我只想在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
这似乎是最适合人类阅读和合乎逻辑的方式。但是我不确定它是否最有效。
【问题讨论】:
-
这个触发器只有
for update吗?还是它处理更新、删除和插入? -
不相关:
USING (SELECT * FROM inserted) AS Source可以缩短为USING Inserted AS Source。 -
@ShannonSeverance 仅更新
标签: sql sql-server tsql merge