删除更新以触发相同的字段

时间:2011-10-11 16:04:08

标签: sql-server tsql sql-server-2000

我正在研究一些遗留代码,这些代码一次在一个字段的特定行上执行更新。历史记录的工作方式是每次发生更新,插入或删除时都会写入所有字段。如果在触发器完成对历史记录表的插入后,如何消除特定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相同的情况下才能收集数据。

1 个答案:

答案 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