2016-05-19 50 views
0

更新時にトリガーを作成したいと思います。シリンダーとジョブの2つのテーブルがあります。シリンダー内のstatusIdがある値(例えば2)に変わると、両方のテーブルのフラグフィールドが変更されます。シリンダテーブルは頻繁に更新されます。 statusIdフィールドが2の値に変更された場合、挿入されたテーブルと削除されたテーブルを確認する必要があると思います。特定の値に変更された場合に1つのフィールドを更新する更新時にトリガーする

ここでは単純なバージョンのテーブルです。これらは、更新文がしか単一のテーブルを更新することができますので、さて、あなたは、2つの異なるupdate文が必要jobNumb

CREATE TABLE Cylinder (
    cylinderId int IDENTITY(1,1) PRIMARY KEY, 
    jobNumb int NOT NULL, 
    statusId int, 
    flag int 
) 

CREATE TABLE Jobs (
    jobId int IDENTITY(1,1) PRIMARY KEY, 
    jobNumb int NOT NULL, 
    statusId int, 
    reShip int, 
    flag int 
) 
+0

は値が2からのすべての変更を行います。

更新のトリガーは次のようになりますか?ルールの例をもっと教えてもらえますか? –

+0

値は約40の異なる値に変更されます。 2は、シリンダが出荷されたことを示す。最終結果は、値が2に変わったときに、トリガーがジョブテーブルをチェックして戻ってくるかどうかを確認します。そうであれば、各テーブルにフラグが設定されます。シリンダーがプラントに戻ったときにフラグが戻されます。 –

+0

シリンダーが出てからstatusIdが戻ってくる前にシステム内の他のものによって変更することができます。私はそれが残って戻ってきたことを示す方法を探しています –

答えて

1

を通して関連しています。
ただし、両方のテーブルのフラグが常に関連する行の値と同じである必要がある場合は、on update cascadeという外部キー制約をこの列に追加することでこれを実現できます。

CREATE TRIGGER ON Cylinder 
FOR UPDATE 
AS 

    -- updates jobs flag 
    UPDATE j 
    SET flag = CASE WHEN i.statusId = 2 THEN 1 ELSE 0 END -- or whatever values suited for your flag 
    FROM inserted i 
    INNER JOIN deleted d ON(i.cylinderId = d.cylinderId AND i.statusId <> d.statusId) 
    INNER JOIN Jobs j ON(i.jobNumb = j.jobNumb) 

    -- updates cyliner flag 
    UPDATE c 
    SET flag = CASE WHEN i.statusId = 2 THEN 1 ELSE 0 END -- or whatever values suited for your flag 
    FROM inserted i 
    INNER JOIN deleted d ON(i.cylinderId = d.cylinderId AND i.statusId <> d.statusId) 
    INNER JOIN Cylinder c ON(i.jobNumb = c.jobNumb) 

GO 
関連する問題