我希望将列的内容复制到同一表中的另一列中。因此,我创建了这个触发器:
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);但是,当我使用表上的更新将KENNSCHT更新为不同的值时,PRODVERPT也不会被更新。现在,您可能会说,这是因为触发器在AFTER INSERT上而不是AFTER UPDATE上,但是当我更改它以便由UPDATE和INSERT触发时,每当我更新任何行时,我都会收到Server的错误消息。
无法更新行,因为它会使行不唯一或更新多行(2行)
这里发生什么事情?要么是触发器什么也没做,要么就是搞乱了整个表,使它无法更新。
更新:我还尝试了以下触发器:
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:表中没有多个行,我已经检查过了,因为我认为它可能与问题相连接。
发布于 2013-09-10 09:59:53
如果以AFTER UPDATE触发器的形式运行此触发器,则会递归运行,因为它总是针对同一个表发出另一个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
ENDhttps://stackoverflow.com/questions/18713994
复制相似问题