2016-05-19 84 views
0

我想在更新时创建触发器。有两个表涉及圆筒和工作。当柱面中的statusId变为某个值时,它会改变两个表中的标志字段。气缸台更新频率很高。我相信我需要检查插入和删除的表,看看statusId字段是否更改为我的值2.更新时触发更新一个字段,如果另一个字段更改为某个值

下面是我的表的简单版本。他们通过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

那么,你需要2个不同的更新语句,因为更新语句只能更新单个表。
但是,如果两个表中的标志始终应该是相关行的相同值,则可以通过在此列上添加外键约束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 
相关问题