【问题标题】:updating multiple tables with triggers - SQL Server使用触发器更新多个表 - SQL Server
【发布时间】:2009-12-03 17:08:09
【问题描述】:

我需要根据 tableB 中的插入来更新我的 tableA。我创建了一个触发器,它在将一行插入 tableB 时触发,并简单地将其复制到 tableA(这正是我想要的)。但是当我更新tableB中的现有记录时,问题就出现了,tableA中的行已经存在具有相同的主键。

为了处理它,我尝试删除 tableA 中主键与更新行匹配的现有行,然后简单地从“插入”表中插入该行。但是,tsql 根本不允许我从触发器中删除我,并给出错误说明“无法绑定多部分标识符“INSERTED.Id”。”

这是我试图在代码方面完成的工作:

delete from dbo.CurrentItems where dbo.CurrentItems.CurrentItemId = INSERTED.Id
INSERT INTO CurrentItems
SELECT * FROM INSERTED
WHERE IsActive = 1

各位有什么想法吗?

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    在 DELETE FROM 语句中,您必须将 INSERTED 伪表添加到您正在操作的表中(在 FROM 子句中),如下所示:

    DELETE dbo.CurrentItems 
      FROM dbo.CurrentItems
         , INSERTED
     WHERE dbo.CurrentItems.CurrentItemId = INSERTED.Id
    
    INSERT INTO CurrentItems
    SELECT * FROM INSERTED
    WHERE IsActive = 1
    

    或者,您可以使用 INNER JOIN:

    DELETE dbo.CurrentItems 
      FROM dbo.CurrentItems CI
           INNER JOIN INSERTED I ON CI.CurrentItemId = I.Id
    

    【讨论】:

    • 单独的触发器——一个用于插入,一个用于更新(那么删除呢?)——可能会更好。
    • @Irfanldrees:不客气。 @Phillip Kelley,我不能不同意你的观点,但这就是海报所要求的。他想知道为什么他的 DELETE 语句不起作用。
    【解决方案2】:

    当 TableB 中的行更新时,为什么不能简单地更新 TableA 中的现有行?更新而不是删除/插入。

    您可以有一个 AFTER INSERT 触发器来执行您现在想要的操作,再加上一个 AFTER UPDATE 触发器来更新 TableA 中的行(而不是插入新行)。

    【讨论】:

      【解决方案3】:

      您说您有一个触发器,该触发器在“将一行插入 tableB”时触发。所以你有触发插入的触发器。在我看来,您也有触发更新的触发器。您是否也希望触发器在更新时触发?如果不是,请从触发器定义中删除“更新”。

      兰迪

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-11
        • 2012-03-13
        • 2011-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-26
        • 1970-01-01
        相关资源
        最近更新 更多