SQL Server при удалении события - PullRequest
0 голосов
/ 21 ноября 2018

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

Рассмотрим таблицу foo, в которой строка первичного ключа имеет значение автоинкрементного целого числа.

fooid|Column1|Column2...
------------------
1
2

Рассмотрим следующую строку таблицы, в которой (среди прочего) есть два столбца, каждый из которых содержит ссылки на внешний ключ обратно на идентификатор в foo.

barId|fooRef1|Stuff|fooRef2
---------------------------

Я пытаюсь реализовать каскадную операцию удаления между foo и bar, чтобы при удалении строки в foo все строки в строке, содержащие этот идентификатор (в любом столбце), тоже удалялись.Существует ограничение проверки, что значения fooRef не могут быть одинаковыми в данной строке.Когда я пытаюсь реализовать каскадное удаление с помощью «ON DELETE CASCADE» в обеих строках внешнего ключа, я получаю ту же ошибку развертывания для циклов и нескольких каскадных путей.Затем я попытался реализовать триггер для события удаления для foo, где при удалении строки он удалит все строки в другой таблице с внешними ключами, установленными в ноль.Однако при реализации этого, когда я затем удаляю проверочное ограничение и «ON DELETE SET NULL» для обеих строк в строке, sql все равно выдает мне эту ошибку.

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

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

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

   1. set reference keys to null 
   2. Disable constraint
   3. Delete data in child tables having ref key as null
   4. Enable constraint
   5. Delete parent keys
0 голосов
/ 11 декабря 2018

Для справки, я так и не понял, почему это происходит, но я исправил это, включив каскад удаления только на одном из 2 внешних ключей

...