SQL Server:自引用FK,触发器而不是删除级联

SQL Server:自引用FK,触发器而不是删除级联,sql,sql-server,foreign-keys,triggers,cascade,Sql,Sql Server,Foreign Keys,Triggers,Cascade,我需要对名为CATEGORY的表执行ON-DELETE级联,该表具有以下列 CAT_ID(BIGINT) 名称(VARCHAR) 父类目录ID(BIGINT) PARENT_CAT_ID是一个FK on CAT_ID。显然,可爱的SQL Server不允许我在DELETE CASCADE上使用循环或多路径删除 我经常看到的一个解决方案是触发器。我做了如下触发: USE [ma] GO /****** Object: Trigger [dbo].[TRG_DELETE_CHILD_CATEGOR

我需要对名为CATEGORY的表执行ON-DELETE级联,该表具有以下列 CAT_ID(BIGINT) 名称(VARCHAR) 父类目录ID(BIGINT)

PARENT_CAT_ID是一个FK on CAT_ID。显然,可爱的SQL Server不允许我在DELETE CASCADE上使用循环或多路径删除

我经常看到的一个解决方案是触发器。我做了如下触发:

USE [ma]
GO
/****** Object:  Trigger [dbo].[TRG_DELETE_CHILD_CATEGORIES]    Script Date: 11/23/2009 16:47:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[TRG_DELETE_CHILD_CATEGORIES] ON [dbo].[CATEGORY] FOR DELETE AS
SET NOCOUNT ON
/* * CASCADE DELETES TO '[Tbl B]' */
DELETE CATEGORY FROM deleted, CATEGORY WHERE deleted.CAT_ID = CATEGORY.PARENT_CAT_ID
手动删除包含子类别的类别时,会出现以下异常:

知道我的扳机怎么了吗

更新: 很抱歉进行编辑,但我有另一列CATEGORY.CAT_SCH_ID,它是另一个表CAT_SCH.ID的FK。这个FK也有一个级联删除,这意味着一旦我删除了一个目录,它的类别也必须被删除。因此,当我定义触发器时,我得到了这个错误:

无法在表“CATEGORY”上创建而不是删除或更新触发器“TRG_DEL_CATEGORY_WITH_CHILDREN”。这是因为表有一个带有级联删除或更新的外键


有什么想法吗?

执行原始删除后,将触发FOR DELETE触发器。要递归删除,需要编写一个而不是delete触发器

算法如下:

  • 将已删除的PKs插入临时表

  • 在临时表中查找记录的详细记录

  • 循环,直到找不到更多记录

通过连接临时表删除表中的记录

我描述了递归删除

更新


我想你只需要把它放到类别中递归外键的deleteCascade标志上。CAT_SCH外键上的级联标志应该无关紧要。

感谢您的回复!这似乎正是我需要的,但有一个小问题,你能看看更新吗?谢谢。很抱歉,在带有on DELETE cascade的表上不能定义
而不是DELETE
。。。