在SQL Server中递归存储和删除数据

时间:2010-02-02 11:11:50

标签: sql-server

我正在为客户的网站创建一个博客组件,我对数据有点问题。我有一个简单的“内容”表,其中包含博客条目的内容。我正在重复使用此表来评论博客条目,因为字段都是相同的。

我已将ContentID添加到内容表中,以便我可以将评论链接到其父内容项。为了确保我没有获得僵尸内容项,我添加了一个触发器,以在删除内容项时删除任何子内容项:

delete from content where ParentID in (select ID from deleted)

但是,当我删除甚至没有任何子内容项的内容项时,我从SQL Server(2008)收到错误:

Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32).

触发器应针对已删除的内容触发一次,但如果内容没有子节点则不应再次调用?有人知道我为什么会收到这个错误吗?

TIA

2 个答案:

答案 0 :(得分:0)

您最好使用基于集合的解决方案:

WITH    h AS
        (
        SELECT  id
        FROM    content
        WHERE   id = @row_to_delete
        UNION ALL
        SELECT  c.id
        FROM    h
        JOIN    content c
        ON      c.parentID = h.id
        )
DELETE
FROM    content
WHERE   id IN
        (
        SELECT  id
        FROM    h
        )

为了确保不留下任何孤儿行,请创建一个伪造的共同祖先,其中包含硬编码id,父级等于id

INSERT
INTO    content (id, parentid)
VALUES  (0, 0)

ALTER TABLE content
ADD CONSTRAINT fk_content_parent_self
FOREIGN KEY (parentId)
REFERENCES content (id)

答案 1 :(得分:0)

将触发器更改为仅在存在行时执行删除

DECLARE @ID int
SELECT @ID = TOP 1 ID from content where ParentID in (select ID from deleted)
IF (@ID IS NOT NULL)
BEGIN
    delete from content where ParentID in (select ID from deleted)
END