2012-12-04 4 views
0

Je développe une base de données pour suivre le mouvement des objets tout au long d'un processus de fabrication. Actuellement, j'ai une table « en direct » de ce qui est actuellement en cours au moment, y compris l'emplacement actuel où il est (tLiveTable)Les déclencheurs de base de données pour une vue historique d'une table dynamique?

tLiveTable:

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

Lorsqu'un PieceID se déplace à une nouvelle emplacement, nous effectuons une mise à jour qui met à jour le LocationRef vers le nouvel emplacement et met à jour l'horodatage avec GetDate().

Cependant, pour une vue historique où les PieceIDs étaient dans le passé, j'ai aussi créé un tableau de suivi (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 

sens InOut: 1 = entrée cet endroit , 0 = quitté cette position

Mon plan original était d'INSÉRER un nouvel enregistrement dans tPieceTracking manuellement chaque fois que le PieceID se déplace. Est-ce que je peux utiliser des déclencheurs de base de données ou d'autres types de scripts dans SQL 2005 SP3 pour que la base de données puisse effectuer ce suivi automatiquement (pour que mon application ne soit pas responsable de le faire)? J'ai examiné les déclencheurs de base de données mais la première pierre d'achoppement que j'ai rencontrée est que MSSQL ne supporte apparemment pas BEFORE UPDATE, ce que je pense être ce que je dois déclencher.

Toute aide serait appréciée.

Répondre

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 

Quelque chose comme ça? Je pense que dans SQL Server, vous devez utiliser INSERTED et DELETED pour déterminer ce qui a été mis à jour (au lieu de "UPDATED")

Questions connexes