在sql server中删除ON DELETE CASCADE的触发器问题

时间:2011-12-12 11:15:31

标签: sql-server triggers cascading-deletes

我在Sql server中有两个表

Table A: Id UNIQUEIDENTIFIER NOT NULL
Table B: Id UNIQUEIDENTIFIER NOT NULL
         AId UNIQUEIDENTIFIER NOT NULL,ON DELETE CASCADE (This is Id of Table A)

(注意B的列AId引用A和ON DELETE CASCADE选项)。 B也有像

这样的删除触发器
CREATETRIGGER B_Delete_Trigger
ON [dbo].[B]
FOR DELETE
AS
SELECT * FROM DELETED AS B INNER JOIN A ON B.AId=A.Id

现在,当我在表B上执行删除操作时,上面的触发器返回行,但是当打开时 表A没有返回任何内容。

我知道SQL Server首先从子表中删除记录(本例中为B),然后从父表(本例中为A)中删除记录,因此上述触发器应该在两种情况下都返回一些记录。

请告诉我如何访问父母记录,或者我的观察是错误的。

4 个答案:

答案 0 :(得分:2)

实际上,当您在表A上调用此触发器时,执行顺序为

  1. 从子表B中删除记录。
  2. 从父表A中删除记录。
  3. 触发呼叫
  4. SELECT * FROM DELETED仅包含A表中的数据。

答案 1 :(得分:1)

“FOR”触发器相当于“AFTER”触发器。删除操作完成后触发器触发。因此,当删除触发器执行B时,表A中的记录已经消失。据我所知,没有简单的方法可以访问表A中的记录。

答案 2 :(得分:0)

on删除级联不应该在父表上吗?

这样做的目的是一旦父项被删除,提供其他表引用父项(通过FK约束),那么所有子项记录也将被删除。看起来你有错误的方式吗?

MSDN:

http://msdn.microsoft.com/en-us/library/aa933119(v=sql.80).aspx

答案 3 :(得分:0)

以下项目应注意:

  • 如果是父子关系表,请始终尝试在父表上创建trigger以执行ON DELETE CASCADE
  • 子表不能与父级CASCADE。
  • ON DELETE CASCADE表示:当您从Parent表中删除项目时,所有项目都将从已删除引用的子表中删除。

希望你有我,谢谢你的时间。