【问题标题】:AFTER DELETE trigger does not always fireAFTER DELETE 触发器并不总是触发
【发布时间】:2015-07-21 22:42:30
【问题描述】:

我有表 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

但是,这似乎有时会执行,而不是其他时候。不知道为什么。

【问题讨论】:

    标签: sql sql-server triggers cascading-deletes


    【解决方案1】:

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

    【讨论】:

    • 我明白了。 SET NOCOUT ON的原因是什么?
    • 只是为了抑制消息n rows affected
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多