Есть два способа сделать это: либо с каскадным удалением (который вы установили с ограничение вашего внешнего ключа):
ALTER TABLE [dbo].[Orders] WITH NOCHECK ADD CONSTRAINT
[FK_Orders_Customer] FOREIGN KEY([customerId])
REFERENCES [dbo].[Customer] ([customerId])
ON DELETE CASCADE
... или с помощью триггера, как вы пробовали. (Вы можете попробовать что-то вроде этого, на самом деле Отказ от ответственности:.. Это из памяти и не тестируется)
CREATE TRIGGER DelBilete
ON Curse
AFTER DELETE
AS
BEGIN
DELETE FROM Bilete WHERE IDCursa IN(SELECT IDCursa FROM deleted)
END
GO
Если вы просто удалить, где внешний ключ присутствует в таблице первичного ключа, будут удалены все ваши заказы (или что-то еще Bilete
)!
ETA: При получении внешнего ключа ошибки ограничения:
The delete statement conflicted with the reference constraint "FK_Bilete_Curse".
Если у вас есть ограничение внешнего ключа, и вы хотите удалить из главной таблицы (Curse
) и имеют соответствующие записи удалены из соответствующих таблица (Bilete
), триггер AFTER
не решит проблему, именно потому, что это триггер AFTER. Это происходит после удаления записей. Если они не могут быть удалены, триггер не срабатывает. И если эти записи ссылаются на другие записи, они не могут быть удалены.
Так вы тогда есть два варианта:
Каскадирования удаление, выше;
INSTEAD OF trigger
. (См. here для более подробной информации)
INSTEAD OF, триггером в вашем случае будет выглядеть следующим образом (опять же, из памяти и документации, но не тестировался):
CREATE TRIGGER DelBilete
ON Curse
INSTEAD OF DELETE
AS
BEGIN
DELETE FROM Bilete WHERE IDCursa IN(SELECT IDCursa FROM deleted)
DELETE FROM Curse WHERE IDCursa IN (SELECT IDCursa from deleted)
END
GO
С INSTEAD OF
триггером, когда вы выполняете код для удаления записи с Curse
, вместо этого запускается триггер. Он удаляет связанные записи из Bilete
, а затем выполняет удаление с Curse
.
INSTEAD OF
триггеры не запускаются рекурсивно, поэтому DELETE от Curse
в триггере не вызывает другого запуска триггера.
Да, это возможно. Но код, который вы опубликовали, не ссылается на виртуальную удаленную таблицу. –
@SeanLange - Я не понимаю. Вы можете быть более конкретным, пожалуйста? Может быть, пример? – rrrrdc
Посмотрите инструкцию на удаление. Это будет удалять каждую строку в Bilete, которая имеет соответствующую строку в Curse. Там нет условия для удаления строки Bilete для строки Curse, которую вы только что удалили. Измените свой подзапрос, чтобы выбрать из удаляемого вместо него, и он должен быть в значительной степени тем, что вы хотите. –