#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 (клиника -> банк), спасибо. БОЖЕ, каскад действительно работает, это потрясающе!!!!