SQL Server:自引用FK,触发器而不是删除级联
我需要对名为CATEGORY的表执行ON-DELETE级联,该表具有以下列 CAT_ID(BIGINT) 名称(VARCHAR) 父类目录ID(BIGINT) PARENT_CAT_ID是一个FK on CAT_ID。显然,可爱的SQL Server不允许我在DELETE CASCADE上使用循环或多路径删除 我经常看到的一个解决方案是触发器。我做了如下触发: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
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
。。。