我正在研究一些遗留代码,这些代码一次在一个字段的特定行上执行更新。历史记录的工作方式是每次发生更新,插入或删除时都会写入所有字段。如果在触发器完成对历史记录表的插入后,如何消除特定orderId,较小时间间隔内的最后一次更新以及相同的用户ID?
delete from tblHistory as h
where h.OrderId in
(SELECT OrderId
from inserted
where datediff("s",myDate, getdate() ) <= 5)
and exists (select b.*
FROM inserted as b
WHERE b.userId = h.userId and
b.OrderId = h.orderId) -- except last one
-- within last 1 to 5 seconds
我的tblHistory将HistoryId作为自动递增主键。所以我应该有两个或更多的HistoryId,但只有一个OrderId,日期差异需要在至少5秒内。我想确保我的历史记录没有溢出,因为我们只有有限的空间来跟踪历史记录。 此外,我只想在用户ID相同的情况下才能收集数据。
答案 0 :(得分:1)
我在质疑你为什么要删除这些记录 - 如果你必须这样做,我会质疑你为什么要在触发器内做这件事。我更喜欢一种解决方案,每天减少数据。 但如果你真的必须这样做,这可能有效:
delete h
from tblHistory h
inner join inserted i
on i.OrderId = h.OrderId
and i.UserId = h.UserId
where h.MyDate > dateadd("s",-5,getdate())
and h.HistoryID <
(select max(h2.HistoryID)
from tblHistory h2
where h2.OrderId = i.OrderId);
我认为可以一次插入多行,从而导致插入的记录更多。 最后它应该删除最大值。每次执行一条记录。 您可能需要(OrderId,HistoryId)和(OrderId,UserId,MyDate)上的索引才能获得良好的性能。
HTH