【问题标题】:SQL Server TRIGGER UPDATE on changeSQL Server 触发更新更改
【发布时间】:2020-03-24 13:04:24
【问题描述】:

我正在尝试为网上商店进行触发更新,并且我希望每次向订单中添加某些内容时更新总金额 (col2),所有订单都在一个表中完成 (table1)然后所有订单都存储在另一个表中(table2)。我不断收到table1.col1 = table2.col1 的错误,其中col1 是一个ID。

CREATE TRIGGER table2.col2
ON table1
FOR UPDATE
BEGIN
    UPDATE table2
    SET newTable =
        (SELECT table2.col2 AS p
        FROM table2
        JOIN inserted AS i
        ON p.orderId = i.orderId)
    WHERE table2.orderId = table1.orderId
END

【问题讨论】:

  • 为什么您的触发器没有引用 inserteddeleted 对象?
  • 我以为SELECT 引用了他们
  • 您的选择引用 table2 和 table1 - 没有提到 Inserted
  • 您更新的明显问题是WHERE table1.col1 = table2.col1 如果不是正在更新或加入的表,则您无法在 where 子句中访问 table1。

标签: sql-server tsql triggers


【解决方案1】:

您可以在没有子查询的情况下重新编写它,但快速解决方法是将inserted 添加到您的where 子句中,如下所示:

CREATE TRIGGER table2.col2
ON table1
FOR UPDATE
BEGIN
    UPDATE table2 SET
        newTable = (
            SELECT table2.col2 AS p
            FROM table2
            JOIN inserted AS i
            ON p.orderId = i.orderId
        )
    WHERE table2.orderId in (select orderId from Inserted)
END

Inserted 是一个伪表,其中包含一行,其中每一行都更新了新数据(大列除外)。

【讨论】:

  • Inserted 是否引用 ON table1 的内容?
  • @RodrigoL 你读过我在插入和删除伪表上提供的参考链接吗?
  • 是的,只是在理解上有点困难,它会在运行UPDATE 时创建行的副本。我只是不明白in (select orderId from Inserted) 将如何解决引用问题。
  • (select orderid from Inserted) 为您提供了正在更新的 ID 列表,因此您可以从实际表中提取相同的行来进行实际更新。我的逻辑可能不正确,因为我不完全了解您在做什么,但它似乎与您发布的内容相符。
猜你喜欢
  • 2011-06-03
  • 1970-01-01
  • 2016-11-03
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 2014-10-23
相关资源
最近更新 更多