SQL Update触发器 - 保留所有会话/版本

时间:2016-01-25 09:27:28

标签: sql-server

我有一个名为InvStockTake(P)的生产表,该表复制到另一台服务器上,也称为InvStockTake(R)。
将它们引用为P用于生产,R引用为复制。

在复制表上,我创建了一个插入触发器,如下所示,它将插入的数据复制到另一个名为InvStockTakeReplicate(R)的表中

ALTER TRIGGER [dbo].[trgAfterInsert] ON [dbo].[InvStockTake] 
FOR INSERT
AS  
    insert into SysproCompanyR.dbo.InvStockTakeReplicate
           (Warehouse,StockCode,Bin,OrigQtyOnHand,QtyCaptured,SaveDate,ProductClass,Uom,Reference,PrintedFlag,Decimals,NumTimesCaptured,CreatedBinFlag,SelectionCost) 
    SELECT  Warehouse,StockCode,Bin,OrigQtyOnHand,QtyCaptured,SaveDate,ProductClass,Uom,Reference,PrintedFlag,Decimals,NumTimesCaptured,CreatedBinFlag,SelectionCost 

    FROM inserted; 

问题是,我的生产表中的表格会让我们说看起来像这样

Warehouse   StockCode   Bin OrigQtyOnHand   QtyCaptured SaveDate    ProductClass NumTimesCaptured
A1          20402205   S10D04       12       12         2016-10-27           333  3
A1          20402206   S10D03       11       11         2016-10-27           376  2
A1          30303021   S10F04        2       2          2016-10-27           354  1
A1          32700103   S10A04        1       1          2016-10-27           333  1

当它被插入时,它将复制到我的另一个表 现在这个表是如何工作的,当仓库处于库存采取模式时,人们将在这里不断捕获。所以你会看到numtimescapture列会随着许多人捕获而更新,qtycaptured也会改变。

所以我也需要一个更新触发器,但现在说完成了库存,2周后这个仓库A1被置于库存盘点模式,它将从我的生产数据库中擦除所有A1库存并插入新的他们需要重新计算的股票记录。但现在保存日期将更改为新日期 现在我假设当发生这种情况时,由于我只有一个插入触发器,它只会插入这些新记录。但是我的更新触发器会发生什么?它需要使用新日期更新记录....

因此,如果有人可以帮助我使用此更新触发器,那么它将极大地帮助我,因为我需要最终构建一个表,以保持所有不同的库存获取会话/版本。

1 个答案:

答案 0 :(得分:1)

由于您希望保留每个记录的每个版本,因此您的UPDATE触发器可以与INSERT触发器相同。您所要做的就是改变它:

ALTER TRIGGER [dbo].[trgAfterInsert] ON [dbo].[InvStockTake] 
FOR INSERT
AS  

要:

ALTER TRIGGER [dbo].[trgAfterInsert] ON [dbo].[InvStockTake] 
FOR INSERT, UPDATE
AS