如何从已删除的标头表中检索触发器中的数据

时间:2011-01-18 18:13:33

标签: sql tsql triggers

我的情况是我有一个Header和一个Detail表。 Detail表与Header表具有Cascade删除的外键关系。

删除详细记录后,我需要使用触发器更新其他表。我遇到的问题是我需要从Header表中提取一些信息以及删除记录的Detail表。如果我删除详细记录,然后删除标题记录,则触发器似乎运行正常。但是,如果我删除了Header记录,而后者由于级联删除而删除了详细记录,那么当触发器执行时,Header记录已被删除,我无法从中获取所需的信息。

我对触发器很新,所以我想知道是否有一些我不知道的事情以及我是如何实现这一目标的。

这是我的代码:

ALTER TRIGGER [Detail_Delete]
   ON [Detail]
   AFTER DELETE
AS 
BEGIN
 SET NOCOUNT ON;

 DECLARE @Table UpdateTableType

 -- Here is where the problem lies.
 -- No records are found here because the Header record isn't found.
 INSERT @Table
 (HeaderID, UserID)
 SELECT d.HeaderID, h.UserID
 FROM deleted d
 JOIN Header h ON h.HeaderID = d.HeaderID

 EXECUTE sp_UpdateSummary
  @Table = @Table
END

2 个答案:

答案 0 :(得分:3)

我不会使用级联删除,因为如您所见,删除的父数据不可用

存储过程非常适合这种情况。如果不是出于任何原因,您可以在Header表上使用BEFORE触发器来执行Detail和其他删除(当然还有Header表)

ALTER TRIGGER [Header_Delete]
   ON [Header]
   INSTEAD OF DELETE
AS 
BEGIN
 SET NOCOUNT ON;

 DECLARE @Table UpdateTableType

 -- DELETED has data, even though Header has not yet been touched
 INSERT @Table
 (HeaderID, UserID)
 SELECT d.HeaderID, d.UserID
 FROM deleted

 DELETE Detail WHERE ... (using @Table)

 DELETE Other WHERE ... (using @Table)

 DELETE Header WHERE ... (using @Table)

 EXECUTE sp_UpdateSummary
  @Table = @Table ...
END

答案 1 :(得分:0)

如果首先删除Header记录,则在Detail - 记录触发器运行时,您无法访问该记录,因为Header记录已被删除。