删除未执行的触发器

时间:2012-07-17 20:02:16

标签: sql sql-server triggers sql-delete

我有一张表Absence,其中包含PK AbscenceId(是拼写错误)。我有另一张表格Note,其中FK为Absence,名为AbsenceId(这次拼写正确)。 FK约束是:

ALTER TABLE [dbo].[Note]  WITH CHECK ADD  CONSTRAINT [FK_Note_Absence] FOREIGN KEY([AbsenceId])
REFERENCES [dbo].[Absence] ([AbscenceId])
GO

删除Absence后,我希望所有Notes都可以使用它。我无法使用CASCADES执行此操作,因为Note也可以属于其他内容。

所以当删除缺席时我创建了一个删除笔记的触发器:

ALTER TRIGGER [dbo].[TR_OnAbsenceDelete] ON [dbo].[Absence]
    FOR DELETE AS

    DELETE FROM [Note]
        WHERE AbsenceId IN ( SELECT AbscenceId FROM Deleted )

但是当我删除附加了Absence的{​​{1}}时,我得到:

Note

这几乎就像触发器没有被执行?

2 个答案:

答案 0 :(得分:3)

您的触发器需要写为INSTEAD OF触发器,首先从Note中删除,然后从Absence中删除。

CREATE TRIGGER [dbo].[TR_OnAbsenceDelete] ON [dbo].[Absence]
    INSTEAD OF DELETE AS
BEGIN

    DELETE FROM n
        FROM deleted d
            INNER JOIN Note n
                ON d.AbscenceId = n.AbsenceId

    DELETE FROM a
        FROM deleted d
            INNER JOIN Absence a
                ON d.AbscenceId = a.AbscenceId
END

答案 1 :(得分:1)

问题是,当您尝试从缺席中删除记录时,由于引用约束而失败。如果删除成功,则将调用您的删除触发器。

另外,根据此链接的建议,您可以尝试代替How can I fire a trigger BEFORE a delete in T-SQL 2005?