我想将一列的内容复制到同一个表中的另一列中。因此,我创建了这个触发器:
ALTER TRIGGER [dbo].[kennscht_copy_to_prodverpt]
ON [dbo].[Stammdaten]
AFTER INSERT
AS
UPDATE Stammdaten
SET PRODVERPT = (SELECT KENNSCHT FROM INSERTED)
WHERE SNR = (SELECT SNR FROM INSERTED);
但是当我在表上使用 UPDATE 将 KENNSCHT
更新为不同的值时,PRODVERPT
也不会更新。现在,您可能会说这是因为触发器位于 AFTER INSERT
而不是 AFTER UPDATE
,但是当我更改它时,它是由 UPDATE
触发的和 INSERT
,每当我更新任何行时,我都会从 SQL Server 收到错误消息
Cannot update row because it would make the row not unique or update multiple rows (2 rows) [sic]
这是怎么回事?触发器要么不执行任何操作,要么弄乱了整个表,使其无法更新。
更新:我还尝试了以下触发器:
UPDATE s
SET s.PRODVERPT = i.KENNSCHT
FROM Stammdaten s
INNER JOIN INSERTED i ON i.SNR = s.SNR;
但它具有完全相同的行为。如果我仅使用AFTER INSERT
,则不会发生任何变化,如果我使用AFTER INSERT, UPDATE
,我会收到上面的错误消息。
更新 2:表中没有多行,我已经检查过,因为我认为它可能与该问题有关。
最佳答案
如果将此触发器作为 AFTER UPDATE
触发器运行,它会递归运行,因为它总是对同一个表发出另一个 UPDATE 语句,这会导致触发器的另一次执行。
要解决此问题,您需要将更新触发器设置为 INSTEAD OF UPDATE
触发器,或者测试 KENNSCHT
列是否已被修改。对于后者,您可以使用 UPDATE()
函数,如下所示:
ALTER TRIGGER [dbo].[kennscht_copy_to_prodverpt_after_update]
ON [dbo].[Stammdaten]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON
IF (UPDATE(KENNSCHT))
BEGIN
UPDATE s
SET s.PRODVERPT = i.KENNSCHT
FROM Stammdaten s
INNER JOIN INSERTED i ON i.SNR = s.SNR
END
END
关于SQL Server 触发器在插入和更新后未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18713994/