【问题标题】:How to write trigger to update row in another table?如何编写触发器来更新另一个表中的行?
【发布时间】:2016-05-20 22:55:21
【问题描述】:

我有两张桌子:

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

还有这个:

CREATE TABLE Inspections
(
Id int,
IsRepaired Bit
);

EventsCnfig 表中的InspectionIdInspections 表的外键,具有一对多的关系。

这里是 SQL plunker

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

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

【问题讨论】:

  • 尽你所能编写触发器,我们将提供帮助。到目前为止你尝试了什么?

标签: sql sql-server tsql


【解决方案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,而 old 行(更新前)没有 --> 那么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

【讨论】:

  • 马克,谢谢你的回答。在 SQL 小提琴中,当我尝试创建插入和更新触发器时出现错误:关键字“TRIGGER”附近的语法不正确。我试过了;但我仍然收到错误。所以知道如何在 sql fiddle 中创建多个触发器吗?
  • @Michael:两者之间可能需要GO
【解决方案2】:

您可以在此处阅读有关触发器的所有信息:

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

应该有足够的信息来自己构建触发器。 如果您的“已完成”触发器无法按您想要的方式工作,您可以在此处发布,社区会为您提供帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 2011-07-12
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多