2011-09-27 172 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 **! –