数据库触发器用于实时表的历史视图?

时间:2012-12-04 11:32:23

标签: sql sql-server-2005 database-trigger

我正在开发一个数据库来跟踪整个制造过程中物体的移动。目前我有一个“实时”表格,显示当前正在进行的操作,包括当前位置(tLiveTable)

tLiveTable:

PieceID   TimeStamp            LocationRef
------------------------------------------
30        03/12/2012 09:16:26       8

当PieceID移动到新位置时,我们执行UPDATE,将LocationRef更新到新位置,并使用GetDate()更新时间戳。

但是,对于过去PieceIDs的历史视图,我还创建了一个跟踪表(tPieceTracking)

tPieceTracking:

PieceID   TimeStamp            LocationRef      InOut
-----------------------------------------------------
30        03/12/2012 09:11:34       1             1
30        03/12/2012 09:12:13       1             0
30        03/12/2012 09:14:27       2             1
30        03/12/2012 09:15:01       2             0
30        03/12/2012 09:16:26       8             1

InOut含义:1 =进入该位置,0 =离开该位置

我最初的计划是每次PieceID移动时手动将新记录插入到tPieceTracking中。

我的问题是,我可以在SQL 2005 SP3中使用数据库触发器或其他类型的脚本,以便数据库可以自动执行此跟踪(以便我的应用程序不负责这样做)吗?

我研究过数据库触发器,但我遇到的第一个绊脚石是MSSQL显然不支持BEFORE UPDATE,我认为这是我需要触发的。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

CREATE TRIGGER trig ON tLiveTable AFTER UPDATE
AS
     INSERT INTO tPieceTracking select t.PieceID, getdate(), PrevLocation, 0
     FROM UPDATED t
     INNER JOIN
    (
        SELECT MAX(LocationRef) as PrevLocation, PieceID
        FROM tPieceTracking
        GROUP BY PieceID
    ) p on p.PieceID = t.PieceID

     INSERT INTO tPieceTracking select t.PieceID, getdate(), LocationRef, 1
     FROM UPDATED t

那样的东西?我认为在SQL Server中你实际上必须使用INSERTED和DELETED来计算已更新的内容(而不是“UPDATED”)