Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
插入、删除、更新时的SQL触发器_Sql_Tsql_Triggers - Fatal编程技术网

插入、删除、更新时的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
大于一,您可以在触发器的开始处引发错误,以防止多行更新导致触发器行为不正常。

您的触发器不处理多行…永远不要在触发器内使用光标!!是的,您需要处理
插入的
删除的
伪表中的多行-但是请不要使用光标!