SQL删除触发器

标签 sql sql-server triggers

假设我有三个表:

表_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 中的相应行。

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

最佳答案

您的触发器将在稍作更正(删除拼写错误)后正常工作:

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

关于SQL删除触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18682998/

相关文章:

mysql - 无法更新存储触发器中的表,因为它已被调用此存储触发器的语句使用

mysql - 如果条件不成立,如何选择无?

python - Pandas 加载 CSV 比 SQL 更快

sql - 在SQL中查询没有时间的日期时间

javascript - jQuery .trigger() 多个事件

Mysql datetime格式加10分钟

java - 准备好的语句和setString

sql - 使用 JSON 字段时的查询优化

sql - 错误[22P02] : invalid input syntax for integer: “”

sql-server - 为什么无法在 Windows 7 Professional 64 位 SP1 上安装 SQL Server Express 2016?