0

删除父级时,我需要删除表的子级。常见的订单/详细信息示例。

我用这个来代替触发器:

CREATE TRIGGER trg_OderDelete
   ON  Oders
   INSTEAD OF DELETE
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for trigger here
    Delete from Details where IDOrder IN(select deleted.IDOrder from deleted)
    Delete from Orders where IDOrder IN(select deleted.IDOrder from deleted)
END
GO

首先,我只尝试使用第一个删除语句,但只删除详细信息,而不是订单,所以我添加了第二个删除来删除订单。

我怀疑这是否正确。我的意思是,如果我删除订单时触发了触发器,为什么我要在触发器中添加删除语句来删除执行触发器的订单?

我也想知道这个:

1.-是交易吗?我的意思是,如果我删除了详细信息,并且由于某种原因无法删除订单,那么最终详细信息不会被删除?

2.- 当我删除订单时,此交易避免添加新的细节?想象一下,我想删除一个订单,在触发器中执行了第一次删除,详细信息,但在执行第二次删除,订单之前,其他用户尝试添加新的详细信息。是否添加此详细信息是因为订单在交易中被阻止?

谢谢。

4

1 回答 1

1

为什么我要在触发器中添加删除语句来删除执行触发器的顺序?

因为它是一个INSTEAD OF触发器——你已经告诉 SQL Server 你将负责执行删除。

是交易吗?我的意思是,如果我删除了详细信息,并且由于某种原因无法删除订单,那么最终详细信息不会被删除?

导致该触发器触发的外部DELETE要么已经在事务中,要么已经导致一个事务启动。如果发生错误导致您的触发器在两次删除之间中止,并且调用者具有处理错误的适当策略(例如XACT_ABORTis ON;或者他们正在使用TRY/CATCH或检查@@ERROR和调用ROLLBACK),那么您的第一次删除将在以下情况下回滚事务回滚。

如果,OTOH,他们仍然忽略错误并提交事务,那么您最终可能会发现这些Details行仍然被删除。

当我删除订单时,此交易避免添加新的细节?想象一下,我想删除一个订单,在触发器中执行了第一次删除,详细信息,但在执行第二次删除,订单之前,其他用户尝试添加新的详细信息。是否添加此详细信息是因为订单在交易中被阻止?

DELETE反对者将Details在该表上获得排他锁。在事务提交之前,没有人能够对该表执行INSERT// UPDATEDELETE

于 2013-05-15T10:42:23.060 回答