更新触发器以从另一个更新新表

时间:2018-07-22 16:52:32

标签: sql sql-server

我有2个表mpaymentaccount。当某人更新mpayment中的数据时,触发器应使用新近更新的数据自动更新account表。我在mpayment表上编写了此触发器,但是当我尝试更新一些数据时,出现错误:

  

更新或删除行值会使行变得唯一,或者改变多行[2行]

这是我要使用的触发器

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[mpacupdate]
ON [dbo].[mpayment]
AFTER UPDATE 
AS
BEGIN
    DECLARE @pid AS NCHAR(10)
    DECLARE @memid AS NCHAR(10)
    DECLARE @pdate AS DATE
    DECLARE @pamount AS MONEY
    DECLARE @flag AS INT

    SELECT @pid = list.pid FROM inserted list;
    SELECT @memid = list.memid FROM inserted list;
    SELECT @pdate = list.pdate FROM inserted list;
    SELECT @pamount = list.pamount FROM inserted list;
    SELECT @flag = list.flag FROM inserted list;
BEGIN
    UPDATE [dbo].[account]
    SET memid = @memid, pdate = @pdate,
        pamount = @pamount, flag = @flag
    WHERE pid = @pid
END
END

1 个答案:

答案 0 :(得分:1)

您的触发器假设一次只更新1行;不应该。将数据视为数据集,而不是标量值集。

这可能无法解决问题,因为这里没有可供测试的示例数据。我也不太确定您在这里追求的是正确的设计选择,但是,关于那是什么没有任何信息。通常,您不应该在表之间重复数据。如果您需要另一个表中的数据,则使用JOININSERTUPDATE都不要。如果它们不同步,您将开始获得一些我认为很奇怪的结果。

无论如何,按原样,这可能是您正在寻找的内容,但是,请考虑我在上面所做的评论:

ALTER TRIGGER [dbo].[mpacupdate] ON [dbo].[mpayment]
AFTER UPDATE
AS BEGIN

    UPDATE A
    SET memid = i.memid,
        pdate = i.pdate,
        pamount = i.pamount,
        flag = i.flag
    FROM dbo.Account A
         JOIN inserted i ON A.pid = i.pid;
END