如何處理多行到更新觸發器/如何修改我的實際觸發器以具有當前行爲?如果我只更新一行的偉大工程,但如果我在同時更新多個行我得到的錯誤:在sql觸發器更新中處理多行
Msg 512, Level 16, State 1, Procedure TriggerUpdateAdvert, Line 9
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
這是我的觸發器:
ALTER TRIGGER dbo.TriggerUpdateAdvert
ON dbo.Advert FOR UPDATE
AS
DECLARE @OldStatus INT;
DECLARE @NewStatus INT;
DECLARE @ID UNIQUEIDENTIFIER;
SET @ID=(SELECT I.ID_Advert FROM INSERTED I);
PRINT @ID
SET @OldStatus=(SELECT D.Status FROM DELETED D WHERE [email protected]);
SET @NewStatus=(SELECT I.Status FROM INSERTED I WHERE [email protected]);
IF(@[email protected])
BEGIN
print @OldStatus
print @NewStatus
IF(@NewStatus=1 or @NewStatus=3)
BEGIN
UPDATE Advert SET Published_Date=GETDATE() WHERE [email protected]
END
END
GO
編輯:
我創建下一個代碼:
UPDATE A
SET A.Published_Date=GETDATE()
FROM Advert A
INNER JOIN Inserted I ON A.ID_Advert=I.ID_Advert
INNER JOIN Deleted D ON D.ID_Advert=A.ID_Advert
WHERE I.Status!=D.Status AND (I.Status IN (1,3) AND D.Status NOT IN (1,3))
你有什麼想法嗎?
你**的主要缺陷**是你承擔觸發器將被稱爲**每行一次** - 這是** **不!它將在每個語句**中調用一次**,並且'Inserted'僞表可以包含多行** - 所以在這種情況下 - 您在這裏選擇多行中的哪一行? 'SET @ ID =(SELECT I.ID_Advert FROM INSERTED I);'....你需要**重寫你的觸發器**來考慮多行,並適當地處理它們! –