我有表A和B.表B有一个外键约束,参考表B.但由于SQL Server 2000只支持级联删除,而不是nullify,我决定用触发器解决这个问题。
问题:下面的触发器不起作用:
CREATE TRIGGER dbo.TR_A_B_CascadingNullify ON dbo.A
FOR DELETE
AS
UPDATE dbo.B
SET idA = NULL
WHERE idA IN (SELECT id FROM DELETED)
;
删除A中未提及的行时,一切正常。但是当删除引用的行时,它会使用消息DELETE statement conflicted with COLUMN REFERENCE constraint 'FK_B_A'. The conflict occurred in database 'x', table 'B', column 'idA'.
最后,在将选项Enforce Foreign Key Constraint
设置为No
时,触发器确实有效,表B中的列设置为NULL。
我做错了什么?
答案 0 :(得分:2)
最简单的解决方案可能是使用INSTEAD OF触发器,而不是AFTER触发器。然后DELETE操作本身永远不会发生;相反,无论你输入触发器的逻辑是什么,都会运行。
作为标准评论,Microsoft不再支持SQL 2000,因此您应尽快升级到较新版本。
答案 1 :(得分:2)
您的触发器在 DELETE之后触发,即在完成所有参考检查之后。来自documentation of CREATE TRIGGER;
AFTER is the default when FOR is the only keyword specified.
唯一的选择是使用 INSTEAD OF 触发器。