【发布时间】:2012-07-17 20:02:16
【问题描述】:
我有一张桌子Absence PK AbscenceId(是的拼写错误)。我有另一个表Note,在Absence 中有一个名为AbsenceId 的FK(这次拼写正确)。 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 )
但是当我删除一个附有Note 的Absence 时,我得到:
Msg 547, Level 16, State 0, Line 1
The DELETE statement conflicted with the REFERENCE constraint "FK_Note_Absence". The conflict occurred in database "ReturnToWork", table "dbo.Note", column 'AbsenceId'.
The statement has been terminated.�
这几乎就像触发器没有被执行?
【问题讨论】:
-
您是否尝试过使用 INSTEAD-OF 触发器?您还必须删除最初被删除的记录。如果你的 FK 已经有一个删除操作,你就不能使用它。
-
错误信息是不言自明的,不是吗?您不能只从
Note中删除该行,还必须清理其他表中引用它的所有行。 -
我完全理解这个错误,我想我只是假设触发器在之前而不是之后执行,并且不确定触发器是否被调用。
标签: sql sql-server triggers sql-delete