2016-05-20 87 views
1

我有两个表:如何编写触发器更新另一个表中的行?

CREATE TABLE EventsCnfig 
(
Id int, 
InspectionId int, 
Event int 
); 

这:

CREATE TABLE Inspections 
(
Id int, 
IsRepaired Bit 
); 

InspectionIdEventsCnfig表是许多之一关系Inspections表的外键。

这里是SQL plunker

我需要时EventsCnfig表中的任何一行适当列Event的值更新为-1或插入新行与Event值-1行中Inspections表中创建触发器Id必须将列中的IsRepaired值更新为1(true)。

如何编写触发器来实现所需的逻辑?

+2

尽你所能编写触发器,我们将为您提供帮助。到目前为止您尝试了哪些操作? – nicomp

回答

1

我会写触发器 - 一个用于UPDATE,另一个用于INSERT - 如果你尝试做这一个触发器,该代码获取,因为检查的凌乱“这是一个INSERT或UPDATE操作?”等 - 不这样做....

AFTER UPDATE触发:

CREATE TRIGGER dbo.TrgEventsConfigUpdate 
ON dbo.EventsConfig 
AFTER UPDATE 
AS 
    UPDATE insp 
    SET IsRepaired = 1 
    FROM dbo.Inspections insp 
    INNER JOIN Inserted i ON i.InspectionId = insp.Id 
    INNER JOIN Deleted d ON d.Id = i.Id 
    WHERE i.[Event] = -1 AND d.[Event] <> -1 

基本上,更新后,你需要看看它包含更新的行InsertedDeleted假表 - 如果在行(更新后)具有-1的值,而行(更新之前)没有 - >则列Event一直更新为-1,因此IsRepaired在表Inspections需要设为1(true)。

AFTER INSERT触发:

CREATE TRIGGER dbo.TrgEventsConfigInsert 
ON dbo.EventsConfig 
AFTER INSERT 
AS 
    UPDATE insp 
    SET IsRepaired = 1 
    FROM dbo.Inspections insp 
    INNER JOIN Inserted i ON i.InspectionId = insp.Id 
    WHERE i.[Event] = -1 

同样的想法 - 只是简单一点,因为没有“老”行来比较:如果在插入的行列表中列有值-1,然后请更新Inspections表的InspectionId值为1

+0

马克,谢谢你的回答。在SQL小提琴中,当我尝试创建插入和更新触发器时,出现错误:关键字'TRIGGER'附近的语法错误。 我试了END;但我仍然得到错误。所以任何想法如何可以创建多个触发器在SQL小提琴? – Michael

+0

@Michael:你可能需要在两者之间设置一个“GO” –

相关问题