【问题标题】:SQL delete trigger inSQL删除触发器在
【发布时间】:2013-09-08 11:12:05
【问题描述】:

假设我有三个表:

表_1:

 ID     INT     PRIMARY
 name NVARCHAR

表_2:

ID         INT    PRIMARY
Table_1_ID INT (foreign key)

表_3:

ID         INT    PRIMARY
Table_2_ID INT (foreign key)

前两个表有以下触发器:

-- Table_1
CREATE TRIGGER tr_1
ON Table_1
INSTEAD OF DELETE
AS
BEGIN
    DELETE FROM Table_2
    WHERE Table_1_ID IN (SELECT deleted.ID FROM Table_1)

    DELETE FROM Table_1
    WHERE ID IN (SELECT deleted.ID FROM deleted)
END

-- Table_2
CREATE TRIGGER sr_bf_trigger_delete_ID
ON Table_2
INSTEAD OF DELETE
AS
BEGIN
    DELETE FROM Table_3
    WHERE Table_2_ID IN (SELECT deleted.ID FROM deleted)

    DELETE FROM Table_2
    WHERE ID IN (SELECT deleted.ID FROM deleted)
END

这个想法是,一旦我删除Table_1 中的一行(或多行),它将启动触发器并删除Table_2 中的相应行。但是,在删除Table_2中的行之前,Table_3中的对应行被删除了。

这行得通吗?我看到的可能问题是我两次访问同一个“已删除”表。

【问题讨论】:

    标签: sql sql-server triggers


    【解决方案1】:

    您的触发器将在稍作修正(删除错别字)后正常工作:

    CREATE TRIGGER tr_1
    ON Table_1
    INSTEAD OF DELETE
    AS
    BEGIN
        DELETE FROM Table_2
        WHERE Table_1_ID IN (SELECT d.ID FROM deleted as d)
    
        DELETE FROM Table_1
        WHERE ID IN (SELECT d.ID FROM deleted as d)
    END;
    
    -- Table_2
    CREATE TRIGGER sr_bf_trigger_delete_ID
    ON Table_2
    INSTEAD OF DELETE
    AS
    BEGIN
        DELETE FROM Table_3
        WHERE Table_2_ID IN (SELECT d.ID FROM deleted as d)
    
        DELETE FROM Table_2
        WHERE ID IN (SELECT d.ID FROM deleted as d)
    END;
    

    sql fiddle demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      • 2010-09-14
      相关资源
      最近更新 更多