AFTER DELETE触发器并不总是触发

时间:2015-07-21 22:42:30

标签: sql sql-server triggers cascading-deletes

我有表A,B,C .A有一个可空的FK到B,称为BId,B有一个FK到C,带有级联删除。

当删除C时,我需要将A上的BId设置为NULL。因此,当C上的DELETE级联到B时,我希望执行以下触发器:

CREATE TRIGGER AFTER_DELETE_B
ON B
FOR DELETE
AS

BEGIN

   DECLARE @bId INT

   SELECT @bId = Id FROM DELETED

   UPDATE A 
   SET BId = NULL 
   WHERE BId = @bId

END

然而,这似乎有时会执行而不是其他人。无法弄清楚原因。

1 个答案:

答案 0 :(得分:2)

您的触发器不处理多行删除,它只捕获已删除行中的一个ID并更新表A中的相关值,因为只有一个变量,

您需要使用基于集合的方法来处理多个删除。

为此您需要修改触发器定义,如此.....

CREATE TRIGGER AFTER_DELETE_B
ON B
FOR DELETE
AS

BEGIN
 SET NOCOUNT ON;

   UPDATE A 
   SET A.BId = NULL
   FROM A 
   INNER JOIN  DELETED D ON A.BId = D.Id

END