Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 删除后触发器并不总是触发_Sql_Sql Server_Triggers_Cascading Deletes - Fatal编程技术网

Sql 删除后触发器并不总是触发

Sql 删除后触发器并不总是触发,sql,sql-server,triggers,cascading-deletes,Sql,Sql Server,Triggers,Cascading Deletes,我有表A,B,C。A有一个称为BId的可为空的FK到B,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 WHE

我有表A,B,C。A有一个称为BId的可为空的FK到B,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

然而,这似乎有时执行,而不是其他。无法找出原因。

您的触发器没有处理多行删除,它只从删除的行中捕获一个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

我懂了。在上设置NOCODE的原因是什么?只是为了抑制信息
n行受影响