【问题标题】:SQL Trigger on Insert, Delete, Updated插入、删除、更新时的 SQL 触发器
【发布时间】:2011-11-25 15:27:26
【问题描述】:

我有以下触发器

 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...知道我做错了什么吗?

【问题讨论】:

  • 您的触发器无法处理多行...

标签: sql tsql triggers


【解决方案1】:

问题在于您的触发器是AFTER 触发器,这意味着在触发触发器时该行已经从Project 表中删除。因此,您不能将deleted 视图加入Project,因为相应的行将不存在。您需要直接从deleted 视图分配所需的变量。

此外,正如上面 Mitch 的注释所述,如果可以一次更新多行,您可能希望使用游标遍历 inserted/deleted 视图中的所有行。或者,如果 @@ROWCOUNT 大于 1,您可以在触发器开始时引发错误,以防止多行更新导致触发器行为异常。

【讨论】:

  • 你应该永远不要在触发器中使用CURSOR!!是的,您需要处理 InsertedDeleted 伪表中的多行 - 但 PLEEEEEAAAAASSSSEEEEEEEEE 不能使用游标!
猜你喜欢
  • 2012-09-19
  • 2011-05-05
  • 2010-12-17
  • 1970-01-01
  • 2011-02-27
  • 2015-04-26
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多