为什么此级联无效触发器在 SQL Server 2000 上不起作用



我有表A和表B。表B有一个引用表B的外键约束。但由于SQL Server 2000只支持级联删除,而不支持无效,所以我决定用触发器来解决这个问题。

问题:下面的触发器不起作用:

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。

我做错了什么?

您的触发器在DELETE之后(即在完成所有引用检查之后)触发。来自CREATE TRIGGER的文档;

AFTER is the default when FOR is the only keyword specified.

您唯一的选择是使用INSTEAD OF触发器。

最简单的解决方案可能是使用INSTEAD OF触发器,而不是AFTER触发器。那么DELETE操作本身将永远不会实际发生;相反,无论您在触发器中放入什么逻辑,都会运行。

作为标准注释,SQL 2000不再受Microsoft支持,因此您应该尽快升级到新版本。

相关内容

最新更新