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