我有两张桌子:
CREATE TABLE EventsCnfig
(
Id int,
InspectionId int,
Event int
);
而且:
CREATE TABLE Inspections
(
Id int,
IsRepaired Bit
);
InspectionId
表中的 EventsCnfig
是Inspections
表的外键,其关系为一对多。
这是SQL plunker
当EventsCnfig
表中的任何行将列Event
的值更新为-1或插入Event
值的新行-1时,我需要创建触发器{具有适当Inspections
的{1}}表必须将列中的IsRepaired值更新为1(true)。
如何编写触发器以实现所需的逻辑?
答案 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
基本上,在更新之后,您需要查看包含更新行的Inserted
和Deleted
伪表 - 如果 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;触发器无法按您的方式工作,您可以在此处发布,社区将帮助您。