如何编写触发器来更新另一个表中的行?

时间:2016-05-20 22:55:22

标签: sql sql-server tsql

我有两张桌子:

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

而且:

CREATE TABLE Inspections
(
Id int,
IsRepaired Bit
);
InspectionId表中的

EventsCnfigInspections表的外键,其关系为一对多。

这是SQL plunker

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

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

2 个答案:

答案 0 :(得分: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伪表 - 如果 new 行(更新后)值为-1,而行(更新前)没有 - &gt;然后,列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表{1}}值为InspectionId

答案 1 :(得分:0)

在这里,您可以阅读有关触发器的所有内容:

How to use update trigger to update another table?

https://msdn.microsoft.com/en-us/library/ms189799.aspx

http://www.sqlteam.com/article/an-introduction-to-triggers-part-i

应该有足够的信息来自己构建触发器。 如果你有一个&#34;完成&#34;触发器无法按您的方式工作,您可以在此处发布,社区将帮助您。