SQL触发插入,删除,更新
问题描述:
我有以下触发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 ...任何想法我做错了什么?
答
问题是您的触发器是一个AFTER
触发器,这意味着该行在触发器被触发时已从Project
表中删除。因此,您无法将deleted
视图加入Project
,因为相应的行不会存在。您将需要直接从deleted
视图分配所需的变量。同样,正如Mitch的笔记上面提到的,如果一次可以更新多行,您可能需要使用光标遍历inserted
/deleted
视图中的所有行。或者,如果@@ROWCOUNT
大于1,则可以在触发器开始时产生错误,以防止多行更新导致触发器发生错误行为。
+2
你应该**永远**在触发器内使用** CURSOR **!是的,您需要处理'Inserted'和'Deleted'伪表中的多行 - 但不包含光标的** PLEEEEEEAAAAASSSSEEEEEEEEE **! –
你的触发器不处理多行... –