Хранение и удаление данных рекурсивно в SQL Server - PullRequest
0 голосов
/ 02 февраля 2010

Я создаю компонент блога для веб-сайта клиента, и у меня возникла небольшая проблема с данными. У меня есть простая таблица «содержание», которая содержит контент для записи в блоге. Я повторно использую эту таблицу для комментариев к записям в блоге, поскольку все поля одинаковы.

Я добавил ParentID в таблицу содержимого, чтобы я мог связать комментарии с их родительским элементом содержимого. Чтобы гарантировать, что я не получаю зомбированные элементы содержимого, я добавил триггер для удаления любых дочерних элементов содержимого при удалении элемента содержимого:

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).

Триггер должен сработать один раз для удаленного контента, но не должен вызываться снова, если у контента нет дочерних элементов? Кто-нибудь знает, почему я получаю эту ошибку?

1011 * ТИА *

Ответы [ 2 ]

0 голосов
/ 02 февраля 2010

Изменить триггер, чтобы выполнять удаление только при наличии строк

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
0 голосов
/ 02 февраля 2010

Для этого лучше использовать решение на основе множеств:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...