2012-12-04 58 views
0

我正在開發一個數據庫來跟蹤整個製造過程中對象的移動。目前,我有什麼是目前在這個過程中,此刻,包括它是當前位置(tLiveTable)數據庫觸發一個活動錶的歷史視圖?

tLiveTable一個「活」的表:

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

當PieceID移動到一個新的位置,我們執行更新LocationRef到新位置的UPDATE,並使用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
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來找出更新的內容(而不是「更新」)