【问题标题】:SQL update inserted row with triggerSQL 使用触发器更新插入的行
【发布时间】:2015-09-01 12:04:33
【问题描述】:

我正在尝试使用表触发器更新 SQL 中刚刚插入的行。下面是触发器。似乎这只会更新已经插入的行,而不是刚刚插入的行。我做错了什么?

ALTER TRIGGER [dbo].[TRG_DIM_Employee]
ON [dbo].[DIM_Employee]
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON
    UPDATE DIM_Employee
    SET ParentEmployeeKey = i.EmployeeKey
    FROM INSERTED i
    WHERE DIM_Employee.EmployeeId = i.EmployeeId
END

【问题讨论】:

  • 您使用的是哪个版本的 MS SQL?
  • Microsoft SQL Server 2012 - 11.0.5556.0 (X64) 2014 年 10 月 31 日 16:50:24 版权所有 (c) Windows NT 6.3 (Build 9600) 上的 Microsoft Corporation 标准版(64 位) :)(管理程序)
  • 为什么不在 SQL 中设置一个默认值?即使他们为 ParentEmployeeKey 提供值,您也想要一个覆盖触发器?
  • 因为不仅必须更改刚刚插入的行,而且必须更新具有该特定 EmployeeId 的所有行。
  • 您能在员工表中发布一个数据样本吗?

标签: sql tsql triggers sql-insert


【解决方案1】:

据我所知,这是旧的连接语法,但在功能上是等效的。我设置了一个快速测试,但无法重现此问题,似乎按预期工作。

仅供参考,您应该改用正确的 JOIN 语法,这个旧的 ANSI-89 标准已经在 SQL 2012 中以某些形式停用。

【讨论】:

    【解决方案2】:

    您的更新声明不太正确。您需要将您的表与插入的表行一起加入。

    ClientID int,
    ALTER TRIGGER [dbo].[TRG_DIM_Employee]
    ON [dbo].[DIM_Employee]
    AFTER INSERT
    AS
    BEGIN
        SET NOCOUNT ON
    
        UPDATE emp
        SET emp.ParentEmployeeKey = i.EmployeeKey
        FROM  DIM_Employee emp
        JOIN INSERTED i on emp.EmployeeId = i.EmployeeId
    END
    

    更多做更新连接的例子here

    【讨论】:

    • 这个我试过了,结果和原来的说法一模一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    相关资源
    最近更新 更多