插入、删除、更新时的SQL触发器
我有下面的触发器插入、删除、更新时的SQL触发器,sql,tsql,triggers,Sql,Tsql,Triggers,我有下面的触发器 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
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,但是当删除项目时,我无法获取ProjectID或TaskID。。。知道我做错了什么吗?问题是您的触发器是
之后的触发器,这意味着在触发触发器时,该行已经从项目
表中删除。因此,您不能将deleted
视图加入到Project
,因为相应的行将不存在。您需要直接从deleted
视图分配所需的变量
此外,正如上面Mitch的注释所提到的,如果一次可以更新多行,您可能希望使用光标在插入的视图中的所有行上进行迭代。或者,如果@@ROWCOUNT
大于一,您可以在触发器的开始处引发错误,以防止多行更新导致触发器行为不正常。您的触发器不处理多行…永远不要在触发器内使用光标!!是的,您需要处理插入的
和删除的
伪表中的多行-但是请不要使用光标!