2015-06-11 2 views
0

Есть ли возможность удалить из таблицы2 (которая имеет ссылку из таблицы1) после удаления одной строки в таблице1? (Например: если удалить КодКлиент от клиентов в то же время, чтобы удалить заказ он сделал (ИД_заказ))Удалить триггер не работает при выполнении

CREATE TRIGGER DelBilete 
ON Curse 
AFTER DELETE 
AS 
BEGIN 
    DELETE FROM Bilete 
    WHERE IDCursa IN (SELECT IDCursa FROM Curse) 
END 
+1

Да, это возможно. Но код, который вы опубликовали, не ссылается на виртуальную удаленную таблицу. –

+0

@SeanLange - Я не понимаю. Вы можете быть более конкретным, пожалуйста? Может быть, пример? – rrrrdc

+0

Посмотрите инструкцию на удаление. Это будет удалять каждую строку в Bilete, которая имеет соответствующую строку в Curse. Там нет условия для удаления строки Bilete для строки Curse, которую вы только что удалили. Измените свой подзапрос, чтобы выбрать из удаляемого вместо него, и он должен быть в значительной степени тем, что вы хотите. –

ответ

2

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

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. Это происходит после удаления записей. Если они не могут быть удалены, триггер не срабатывает. И если эти записи ссылаются на другие записи, они не могут быть удалены.

Так вы тогда есть два варианта:

  1. Каскадирования удаление, выше;

  2. 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 в триггере не вызывает другого запуска триггера.

+0

AnnL - второй метод не работает. Та же ошибка – rrrrdc

+0

Какая ошибка?После этого я думал, что если у вас действительно установлено отношение внешнего ключа, удаление из 'Curse' до' Bilete' может дать вам ошибку ограничения. Кроме того, если 'Bilete' имеет какие-либо зависимости, у вас может быть такая же проблема с * его * зависимостями. –

+0

'IDCursa' также присутствует в таблице' Bilete' ('IDCursa'). 'Операция удаления противоречит ссылочному ограничению" FK_Bilete_Curse "'. – rrrrdc

Смежные вопросы