2011-09-27 159 views
1

我有以下觸發SQL觸發插入,刪除,更新

ALTER TRIGGER [dbo].[RefreshProject] 
    ON [dbo].[Project] 
    AFTER INSERT,DELETE,UPDATE 
AS 
BEGIN 
SET NOCOUNT ON 
DECLARE @percentage decimal(18,2) 
DECLARE @ProjectID int 
DECLARE @TASKID int 

IF EXISTS(SELECT * FROM Inserted) 
    BEGIN 
     SELECT @ProjectID = Inserted.ProjectID, @TASKID = ISNULL(Inserted.TASKID,-1) from Inserted join Project on Inserted.ScheduleID = Project.ScheduleID 
    END 

IF EXISTS(SELECT * FROM Deleted) 
    BEGIN 
     SELECT @ProjectID = Deleted.ProjectID,@TASKID = ISNULL(Deleted.TASKID,-1) from Deleted join Project on Deleted.ScheduleID = Project.ScheduleID 
    END 

    BEGIN 
     SET @percentage = (SELECT percentage from Project where ProjectID = @ProjectID) 
     EXEC LoadSummary @percentage,@ProjectID, @TASKID 
    END 
END 

插入和我能當一個項目被刪除,以獲得修改的對象的專案編號,但更新,我不能讓ProjectID或TaskID ...任何想法我做錯了什麼?

+2

你的觸發器不處理多行... –

回答

0

問題是您的觸發器是一個AFTER觸發器,這意味着該行在觸發器被觸發時已從Project表中刪除。因此,您無法將deleted視圖加入Project,因爲相應的行不會存在。您將需要直接從deleted視圖分配所需的變量。同樣,正如Mitch的筆記上面提到的,如果一次可以更新多行,您可能需要使用光標遍歷inserted/deleted視圖中的所有行。或者,如果@@ROWCOUNT大於1,則可以在觸發器開始時產生錯誤,以防止多行更新導致觸發器發生錯誤行爲。

+2

你應該**永遠**在觸發器內使用** CURSOR **!是的,您需要處理'Inserted'和'Deleted'僞表中的多行 - 但不包含光標的** PLEEEEEEAAAAASSSSEEEEEEEEE **! –