Не удается удалить запись с помощью триггера

#sql-server #sql-server-2008

#sql-server #sql-server-2008

Вопрос:

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

 ALTER TRIGGER [dbo].[deleteBankAccount]
ON [dbo].[Clinic]
AFTER DELETE
AS
BEGIN

   DELETE FROM Bank_account WHERE number_bank_account = (SELECT TOP 1 number_bank_account FROM DELETED)

END
  

Этот триггер имеет почти тот же код, и в этом как раз проблема.

 DELETE FROM Clinic WHERE Clinic_name = 'Clover'
  

Конфликт произошел в…таблица «dbo.Договор «, столбец ‘Legal_address_Clinic’.

 ALTER TRIGGER [dbo].[DeleteDogovor]
ON [dbo].[Clinic]
AFTER DELETE
AS
BEGIN

   DELETE FROM Dogovor WHERE Legal_address_Clinic = (SELECT TOP 1 Legal_address_Clinic FROM DELETED)

END
  

Как выглядит

Комментарии:

1. Я удивлен, что первый триггер работает так, как вы задумали, он предполагает, что вы будете удалять только одну строку за раз; чего вы никогда не должны предполагать. Однако, если вы хотите удалять строки в других таблицах при удалении родительской, почему бы не использовать CASCADE функциональность?

2.Однако, глядя на ваше изображение, причина в том, что ваша таблица Dogovor имеет внешний ключ к вашей таблице Clinic ; поэтому, чтобы удалить строку из Clinic , Dogovor сначала должны быть удалены связанные строки из. Ваш триггер является AFTER DELETE триггером, поэтому ограничение внешнего ключа уже было бы нарушено. Кроме того, если ваш первый триггер никогда не вызывает аналогичную ошибку, это означает, что Clinic и Bank_account имеют отношение 1 к 1; так почему же они не являются одной и той же таблицей? Однако, как я уже говорил в своем предыдущем комментарии, вы должны подразумевать каскадирование здесь и избавиться от обоих триггеров.

3. Будьте очень осторожны с вашей схемой, с тем, что вы предполагаете, и с тем, как вы тестируете. Банковский счет может быть связан со многими клиниками. Действительно ли имеет смысл удалять банковский счет при удалении одной из связанных клиник? И имеет ли смысл ваша взаимосвязь? Реально ли для многих клиник «совместно использовать» один и тот же банковский счет?

4. Да, логично, что соотношение должно быть 1: 1 (клиника -> банк), спасибо. БОЖЕ, каскад действительно работает, это потрясающе!!!!