0

私は、製造プロセス全体でのオブジェクトの動きを追跡するためのデータベースを開発しています。現在、現在処理中のものの「ライブ」テーブルがあります。これには、現在の場所(tLiveTable)も含まれます。

tLiveTable:

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

PieceIDが新しい場所に移動すると、LocationRefを新しい場所に更新するUPDATEを実行し、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 に答える