0

我正在开发一个数据库来跟踪整个制造过程中物体的移动。目前我有一个“实时”表,其中包含目前正在处理的内容,包括它的当前位置(tLiveTable)

tLiveTable:

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

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

但是,对于过去 PieceID 所在位置的历史视图,我还创建了一个跟踪表 (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,我认为这是我需要触发的。

任何帮助,将不胜感激。

4

1 回答 1

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”)

于 2012-12-04T11:43:10.910 回答