【问题标题】:Database After Update Trigger From Inserted But Not Inserted? [SQL Server]从插入但未插入更新触发器后的数据库? [SQL 服务器]
【发布时间】:2022-01-05 23:56:36
【问题描述】:

我正在尝试创建一个 SQL Server 触发器,当表 1 的更新发生在 val2 列中时,它会采用该值并更新 table2。我正在努力理解如何在听起来很简单的事情上正确地做到这一点。

Image of tables

我相信我的问题是试图设置一个实际上并非来自插入的值。 (唯一更新的值是 val2)。我不知道如何配对在哪里进行更新,而不是在更新的行上获取 ID 以与我想要更新的位置进行比较。对此的任何帮助/建议将不胜感激。以下是我当前不起作用的触发器。

CREATE TRIGGER Pull_ID on table1
AFTER UPDATE
AS
BEGIN
    @id_ = id from inserted
    @val2_ = val2 from inserted
    UPDATE table2
    SET val2 = @val2_
    FROM
    WHERE table2.id = @id_
END

【问题讨论】:

  • 触发器是高度特定于供应商的 - 所以请添加一个标签来指定您使用的是mysqlpostgresqlsql-serveroracle 还是db2 - 或者完全是别的东西。
  • 添加了标签,谢谢
  • 您的触发器有 MAJOR 缺陷,您似乎认为它会被 每行调用一次 - 事实并非如此。触发器将每条语句触发一次,因此如果您的 INSERT 导致此触发器触发插入 25 行,您将触发触发器一次和@987654329 @ 伪表将包含 25 行。您的代码将从Inserted 中选择这 25 行中的哪一行?它是不确定的,您将获得任意行,而您将忽略所有其他行。您需要重写触发器以考虑到这一点!
  • @marc_s 我明白你在说什么。你在任何地方都有这样的例子吗?我想使用 WHERE 子句尝试确定它,但我不明白如何在线查找示例。
  • 查看我的回复 - 希望对您有所帮助

标签: sql sql-server triggers


【解决方案1】:

您需要构建触发器,以便它始终可以处理多行。

所以你是一个正确的基于集合的方法,而不是依赖于你只得到一行的错误假设。

试试这个:

CREATE TRIGGER Pull_ID on table1
AFTER UPDATE
AS
    UPDATE table2
    SET val2 = i.val2
    FROM Inserted i
    WHERE table2.id = i.id

Inserted 伪表包含所有已更新的行 - 它们在UPDATE 之后的 值。根据主键列(假设是Id)将您的Table2 加入该表,并使用适当的、基于集合的、支持多行的单个UPDATE 语句 - 你就完成了!

【讨论】:

    猜你喜欢
    • 2016-10-13
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多