删除父级时,我需要删除表的子级。常见的订单/详细信息示例。
我用它代替触发器:
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.-此交易避免在删除订单时添加新的详细信息?想象一下,我想删除一个命令,在触发器中执行第一次删除,详细信息,但在执行第二次删除之前,命令,其他用户尝试添加一个新的详细信息。是否添加了此详细信息,因为订单在交易中被阻止了?
感谢。
答案 0 :(得分:1)
为什么我要在触发器中添加delete语句来删除执行触发器的命令?
因为它是INSTEAD OF
触发器 - 您告诉SQL Server您将负责执行删除。
是一笔交易?我的意思是,如果我删除了细节,并且由于某种原因无法删除订单,最后细节不会被删除?
导致此触发器触发的外部DELETE
要么已经在事务中,要么已经导致启动。如果发生错误导致您的触发器在两次删除之间中止,和,则调用者有适当的策略来处理错误(例如XACT_ABORT
是ON
;或者他们'重新使用TRY
/ CATCH
或检查@@ERROR
并调用ROLLBACK
),然后当事务回滚时,您的第一次删除将被回滚。
如果,OTOH,他们无论如何都会忽略错误并提交交易,那么你最终可能会删除Details
行。
此交易避免在删除订单时添加新的详细信息?想象一下,我想删除一个命令,在触发器中执行第一次删除,详细信息,但在执行第二次删除之前,命令,其他用户尝试添加一个新的详细信息。是否添加了此详细信息,因为订单在交易中被阻止了?
针对DELETE
的{{1}}将对该表进行独占锁定。在事务提交之前,没有人能够对该表执行Details
/ INSERT
/ UPDATE
。