【问题标题】:Alternative solution for using triggers使用触发器的替代解决方案
【发布时间】:2015-05-06 09:32:51
【问题描述】:

我有一个表,他的 PK 作为 FK 在另外两个表中。 当我从该表中删除一条记录时,我希望根据已删除的行从其他表中删除记录。 我知道有一个使用触发器的解决方案,这是我的:

CREATE TRIGGER Trig_Supp
    ON T_SALARIE
    FOR DELETE
AS
    DELETE FROM T_EVOLUTION
    WHERE Matricule = SELECT Matricule FROM deleted

    DELETE FROM T_EVALUATION
    WHERE Matricule = SELECT Matricule FROM deleted

GO

但是我们的老师告诉我们要寻找另一种可以与此触发器相同的解决方案,但我在互联网上找不到任何东西。

那么真的有另一种解决方案吗?

【问题讨论】:

  • 并且您的触发器并不完全正确,因为 sql server 不会为每一行而是为每个语句触发它们。如果有人用一条语句删除超过 1 行,您的触发器将失败
  • 同意以前的 cmets,但也:更不用说如果 FK 已实际设置,此触发器将不起作用,因为会发生约束检查(并防止第一次删除发生)早在此触发器(将)触发之前。

标签: sql-server triggers


【解决方案1】:

因此,您正在寻找的是能够自动处理级联删除的任何内容,无论使用何种查询来删除它。

正如其他人已经评论的那样,正确的选择是使用删除级联外键,因为显然那里无论如何都存在隐含的外键连接。也像 Damien_The_Unbeliever 说的那样,如果没有这样的约束,如果不先删除引用的子行,就永远无法删除父行。

【讨论】:

    【解决方案2】:

    您可以使用OUTPUT 子句捕获已删除的行,然后从辅助表中匹配和删除。见 BOLhere。

    这样做的好处是可以处理多行。

    【讨论】:

    • OP 说他需要一个模拟触发器的解决方案。需要注意的是,更改每个删除数据的查询可能不是一种选择,而是您必须配置数据库对象,以便在任何查询删除数据时自动处理所有这些。
    猜你喜欢
    • 2013-10-02
    • 2013-03-09
    • 1970-01-01
    • 2011-04-13
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 2020-08-29
    相关资源
    最近更新 更多