2016-09-11 10 views
-1

Я пытаюсь удалить строку из таблицы в моей базе данных, но сначала мне нужно удалить строки, соответствующие этой строке с помощью внешних ключей.Как использовать вместо удаления триггера и все еще удалять строку в SQL Server

Я использую триггер instead of на главном столе и внутри него, я сначала удаляю дочерние строки из других таблиц, соответствующих этой основной строке, а затем я хочу удалить основную строку. Но (как и ожидалось) основная строка не удаляется, потому что это триггер INSTEAD OF.

Если я пытаюсь удалить основную строку в вместо триггера я получаю ошибку:

INSTEAD OF triggers do not support direct recursion. The trigger execution failed

Если я пытаюсь использовать AFTER DELETE курок, я получаю сообщение об ошибке:

The DELETE statement conflicted with the REFERENCE constraint [...]

, потому что я Я пытаюсь удалить строку, которая соответствует другим строкам в других таблицах.

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

Спасибо и позаботься, ребята!

+1

Это то, что каскадные удаления могут решить (например, вы только удаление зависимостей)? Или вы делаете другие вещи с удаленными данными? – ZLK

+0

@ZLK Спасибо за ответ! Я знал, что буду сталкиваться, когда услышу ответ. Это решение для меня, но если бы я хотел сделать что-то еще с данными перед удалением, это будет другая история. –

+0

У вас также есть возможность изменить таблицу, чтобы не проверять ограничение. Например, «alter table X nocheck constraint myConstraintName», затем выполнение операции удаления/манипуляции данными (например, в триггере после удаления), затем верните ограничение на 'alter table X check constraint myConstraintName'. – ZLK

ответ

1

Проблема была решена при помощи @ZLK с помощью каскадного удаления или:

@ZLK: You also have the option of altering the table to not check the constraint. For example, alter table X nocheck constraint myConstraintName , then doing the delete statement/data manipulation (e.g. in an after delete trigger) then turning the constraint back on alter table X check constraint myConstraintName