SQL Server: саморегуляция FK, триггер вместо ON DELETE CASCADE

Мне нужно выполнить ON DELETE CASCADE в моей таблице с именем CATEGORY, которая имеет следующие имена CAT_ID (BIGINT) NAME (VARCHAR) PARENT_CAT_ID (BIGINT)

PARENT_CAT_ID – это FK на CAT_ID. Очевидно, что прекрасный SQL Server не позволяет использовать ON 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 

Когда я вручную удаляю категорию с дочерними категориями, я получаю следующее исключение:

исключение

Любая идея, что не так с моим триггером?

UPDATE: Извините за редактирование, но у меня есть еще один столбец CATEGORY.CAT_SCH_ID, который является FK другой таблицы CAT_SCH.ID. У этого FK также есть CASCADE DELETE, что означает, что после удаления CAT_SCH его КАТЕГОРИИ также должны быть удалены. Итак, я получаю эту ошибку, когда определяю триггер:

Невозможно создать INSTEAD OF DELETE или INSTEAD OF UPDATE TRIGGER 'TRG_DEL_CATEGORY_WITH_CHILDREN' в таблице 'CATEGORY'. Это связано с тем, что таблица имеет FOREIGN KEY с каскадным DELETE или UPDATE.

Есть идеи?

    Триггер FOR DELETE поднимается после выполнения первоначального DELETE. Чтобы удалить рекурсивно, вам нужно написать триггер INSTEAD OF DELETE.

    Алгоритм выглядит так:

    • Вставьте PK из удаленной в временную таблицу

    • Найти записи записей записей в таблице temp

    • Петля до тех пор, пока не будет найдено больше записей

    DELETE записывает в таблицу путем соединения с временной таблицей.

    Я описал рекурсивное удаление в своем блоге .

    Обновить

    Думаю, вам просто нужно отбросить флаг ON DELETE CASCADE из вашего рекурсивного внешнего ключа в категориях. Флаг CASCADE на внешний ключ от CAT_SCH не должен иметь значения.

    Interesting Posts

    Динамический SQL не возвращает результаты запроса доступа Access

    Необязательные параметры в SQL-запросе

    Инкрементное подсчеты SQL для X с помощью Left Outer Join

    Как я могу использовать транзакции «Использовать » в операциях IF в SQL?

    Будет ли SQL Server записывать изменения, если мы не укажем ключевые слова транзакций?

    Могу ли я получить «BULK INSERT» -подобные скорости при вставке из JAVA в SQL Server?

    Некластеризованный индекс в столбце с кластеризацией индексов повышает производительность?

    Как мне запрашивать таблицы, расположенные в другой базе данных?

    Как реализовать идентификатор ASP.NET: разрешить CREATE DATABASE в базе данных «master»

    Получение возврата 0 для SQL Server COUNT () и GROUP BY SQL Server 2016

    Восстановление базы данных SQL Server застряло на 99%

    Преобразование конкретных BigInt в DateTime в T-SQL

    Область SQL Server DATEFIRST

    Дизайн базы данных для внутренних сообщений (например, facebook message)

    Как выполнить текстовый поиск в списке CustomObjects, который содержит слова с ошибками поиска?

    Давайте будем гением компьютера.