这是正确的,而不是删除触发器?关于跳跳虎的其他问题

时间:2013-05-15 10:31:59

标签: sql-server triggers

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

我用它代替触发器:

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

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

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

我也想知道这个:

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

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

感谢。

1 个答案:

答案 0 :(得分:1)

  

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

因为它是INSTEAD OF触发器 - 您告诉SQL Server您将负责执行删除。

  

是一笔交易?我的意思是,如果我删除了细节,并且由于某种原因无法删除订单,最后细节不会被删除?

导致此触发器触发的外部DELETE要么已经在事务中,要么已经导致启动。如果发生错误导致您的触发器在两次删除之间中止,,则调用者有适当的策略来处理错误(例如XACT_ABORTON;或者他们'重新使用TRY / CATCH或检查@@ERROR并调用ROLLBACK),然后当事务回滚时,您的第一次删除将被回滚。

如果,OTOH,他们无论如何都会忽略错误并提交交易,那么你最终可能会删除Details行。

  

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

针对DELETE的{​​{1}}将对该表进行独占锁定。在事务提交之前,没有人能够对该表执行Details / INSERT / UPDATE