我有2个表mpayment
和account
。当某人更新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
答案 0 :(得分:1)
您的触发器假设一次只更新1行;不应该。将数据视为数据集,而不是标量值集。
这可能无法解决问题,因为这里没有可供测试的示例数据。我也不太确定您在这里追求的是正确的设计选择,但是,关于那是什么没有任何信息。通常,您不应该在表之间重复数据。如果您需要另一个表中的数据,则使用JOIN
或INSERT
或UPDATE
都不要。如果它们不同步,您将开始获得一些我认为很奇怪的结果。
无论如何,按原样,这可能是您正在寻找的内容,但是,请考虑我在上面所做的评论:
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