Ручное каскадное удаление в SQL Server 2005 - PullRequest
0 голосов
/ 08 августа 2011

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

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

Есть ли способ, который SQL Server предлагает для формирования таких каскадных запросов на удаление?Или запись списка удалений вручную - единственный вариант?

1 Ответ

1 голос
/ 08 августа 2011

Способ, который SQL Server предлагает для кадрирования каскадных удалений, заключается в использовании ON DELETE CASCADE, который, как вы сказали, вы не можете использовать.

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

Вам потребуется в одной транзакции:

  • Запрос метаданных для получения списка затронутых таблиц. Это должно быть рекурсивным, чтобы вы могли получить таблицы, затронутые первым уровнем, затем таблицы, затронутые первым уровнем и т. Д.

  • Отбрось ограничение. Это также должно быть рекурсивным по тем же причинам, что указаны выше.

  • Удалить записи из всех затронутых таблиц

  • Снова включите ограничения

У кого-то еще может быть более элегантное решение, но я думаю, что это, вероятно, оно.

Это может быть проще сделатьв .NET также с объектами управления SQL, если это возможно.

Я должен также уточнить, что я не одобряю это, поскольку вероятность проблем очень и очень высока.

Я думаю, что ваш самый безопасный способ действий - выписывать удаляемые вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...