为什么这个级联nullify触发器不能在SQL Server 2000上运行

时间:2012-03-08 11:36:46

标签: sql-server triggers foreign-keys sql-server-2000

我有表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。

我做错了什么?

2 个答案:

答案 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 触发器。