删除后触发器并不总是触发
AFTER DELETE trigger does not always fire
我有表 A、B、C。A 有一个到 B 的可空 FK,称为 BId,B 有一个到 C 的 FK,带级联删除。
删除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并更新table 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
我有表 A、B、C。A 有一个到 B 的可空 FK,称为 BId,B 有一个到 C 的 FK,带级联删除。
删除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并更新table 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