我正在开发一个数据库来跟踪整个制造过程中物体的移动。目前我有一个“实时”表格,显示当前正在进行的操作,包括当前位置(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,我认为这是我需要触发的。
任何帮助都将不胜感激。
答案 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”)