【问题标题】:How to access deleted rows of parent table in child trigger如何在子触发器中访问已删除的父表行
【发布时间】:2016-08-09 21:39:06
【问题描述】:

我有 3 个具有级联删除关系的表(Main、Detail、SubDetail)。 还要在 SubDetail 上定义 AFTER Trigger 来检查一些数据。

SubDetail Trigger 需要为一些数据加入 Detail 表,但在 Delete Detail 记录的情况下,我无法访问 Detail 记录。

例子:

SELECT * 
FROM DELETED JOIN Detail on DELETED.DetailId = Detail.Id

如何在SubDetail Trigger中访问Detail表的已删除记录???

更新:

为什么表格提示在我的场景中不起作用?它必须在一个事务中完成所有操作

【问题讨论】:

  • 因此,如果您从Detail 表中删除-它从SubDetail 中删除,那么为什么不在Details 表上使用after delete 触发器,该触发器将从SubDetail 表中获取相关数据?跨度>
  • 你说得对,但我不喜欢这样做,因为有很多关系!通过级联删除,我可以确保不会忘记为任何关系编写代码!

标签: sql sql-server tsql triggers transactions


【解决方案1】:

您可能无法加入到 Defail 表,因为该记录在 Detail 表中不存在,因为您尝试在 DELETE 之后加入并且您有级联删除。您可以使用触发器 INSTEAD OF 来执行此操作 或在触发后删除级联删除和删除相关记录 或更改删除表的顺序

【讨论】:

  • 为什么sql server不删除所有级联记录然后删除自己的记录???请注意,我在 subDetail 触发器上打印文本并首先显示!
  • 我进行了一些测试,这个答案是正确的。即使您将从details 删除的行放入某个历史记录表中,并在删除触发器后尝试将它们加入subdetails - 这不会获得您需要的数据。
  • @Hamid 它是关于执行顺序的,例如:当你输入 DELETE FROM MAIN WHERE ID=... 然后sql server删除这个例子中所有引用的表Detail,删除Detail后它将删除Main 之后,它将在 Detail 和 Main 触发后执行
  • 我知道,但是如果我在 AFTER TRIGGER (subDetail) 中引发错误,所有操作都会回滚,因此我必须使用表提示访问已删除的项目,例如:SELECT * FROM Detail WITH(READCOMMITTED)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-06
  • 2020-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多