繁体   English   中英

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

[英]How to retrieve data in a trigger from the header table that was already deleted

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

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

我是触发器的新手,所以我想知道是否有我不知道的东西以及如何实现这一点。

这是我的代码:

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

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

为此,存储过程是理想的。 如果不是出于某种原因,则可以在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

如果首先删除了Header记录,那么当“ Detail -记录”触发器运行时,您将无权访问它,因为Header记录已被删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM