Способ, который SQL Server предлагает для кадрирования каскадных удалений, заключается в использовании ON DELETE CASCADE
, который, как вы сказали, вы не можете использовать.
Можно запрашивать метаданные, чтобы получить список затронутых записей в другихтаблиц, но это будет сложно, так как вы хотите удалить ограничение (и, следовательно, ссылку на метаданные) перед удалением.
Вам потребуется в одной транзакции:
Запрос метаданных для получения списка затронутых таблиц. Это должно быть рекурсивным, чтобы вы могли получить таблицы, затронутые первым уровнем, затем таблицы, затронутые первым уровнем и т. Д.
Отбрось ограничение. Это также должно быть рекурсивным по тем же причинам, что указаны выше.
Удалить записи из всех затронутых таблиц
Снова включите ограничения
У кого-то еще может быть более элегантное решение, но я думаю, что это, вероятно, оно.
Это может быть проще сделатьв .NET также с объектами управления SQL, если это возможно.
Я должен также уточнить, что я не одобряю это, поскольку вероятность проблем очень и очень высока.
Я думаю, что ваш самый безопасный способ действий - выписывать удаляемые вручную.