我有一张表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
这几乎就像触发器没有被执行?
答案 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?