Обработка удалений записей базы данных с несколькими уровнями потомства

StackOverflow https://stackoverflow.com/questions/1159186

Вопрос

У нас есть база данных, которая обычно имеет такую структуру:

Master Record Table
id (pk)
MasterRecordId <-- constrained to be unique

Дети / братья и сестры (2-е поколение, если хотите):

Table1
(  table1ID (pk),
  MasterRecordID (fk))

Table2
(  Table2ID(pk),
  MasterRecordID (fk))

Внуки (3-е поколение):

Table3
( Table3ID (pk)
 Table1ID (fk))

Table4
 (Table4ID (pk)
  Table1ID (fk))

Table5
 (Table5ID (pk)
  Table2ID (fk))

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

Мне было поручено изучить наилучший способ обработки удаления.Для очистки всей записи, от мастера до внуков, серверная часть - единственный способ сделать это.Это сделало Сильных Мира Сего счастливыми.Но, вы знаете, пользователи лгут, и получается, что нам, возможно, придется это изменить (как для того, чтобы мне не приходилось время от времени выполнять роль официального удалителя записей, так и потому, что существуют определенные типы записей поколения 2, которые удаляют пользователи часто.

Каскадные удаления были первым вариантом, потому что TPTB предпочел бы, чтобы это не требовало работы над новой сборкой приложения.И потому что именно это сорвалось с уст моих боссов в конце той конкретной встречи.Все мои каскады Gen 2 -> Gen 3 работают нормально (и это касается наиболее частого варианта использования / Истории / Того, что у вас есть).Затем я обновил все внешние ключи Master -> Gen 2 для каскадирования при удалении.В надеялся это позволило бы удалить основную запись и чтобы все остальные дети и внучки последовали за ней.Ничего хорошего;Я получаю сообщение об ошибке, нарушающее первый Master -> Gen 2 FK, который появляется при попытке удалить основную запись.Я дважды проверил;FKS настроены на каскадное удаление.

Чего я не понимаю в каскадных удалениях с более чем 1 уровнем связей между таблицами?Я читаю столько, сколько могу (насколько позволяет время), но я еще не открыл для себя знания, которые выведут меня из этого темного времени.Является ли каскадирование неправильным подходом?

Во-вторых, есть два других варианта, как я это вижу:

  1. Выполняйте все удаления в приложении.Не предпочтительно, но если это единственный вариант, то это единственный вариант.Я знаю, что есть аргументы в пользу того, что это лучший вариант, но у TPTB другие взгляды на best, чем у меня (и хотя все они сумасшедшие, они подписывают чеки).

  2. Обрабатывать удаления с помощью триггера?Мне неясно, будут ли внешние ключи мешать этому, но мне пришло в голову, что это может быть вариантом.

Ну, и еще:

  1. Выполните каскадирование Gen 2 -> Gen 3.И тогда нескольким людям с правами на удаление просто нужно будет следовать ритуалам для полного удаления (это было бы:удалите все записи Gen 2 по отдельности, затем удалите основную).Или я останусь Официальным Удалителем записей.
Это было полезно?

Решение 2

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

Итак, мы посмотрим, что TPTB решит, что мне следует делать дальше.

Другие советы

Весь код на T-SQL, который вы бы написали, чтобы "вручную" удалить детей, внуков и т. Д.эл.можно было бы загрузить в триггер в таблице MasterRecord, но я бы счел это ужасным решением, хотя бы по той простой причине, что оно серьезно затрудняет критическую функциональность базы данных.

Я бы сделал это в приложении (или, что предпочтительнее, в хранимой процедуре).Но если это не вариант, тогда да, похоже, вы застряли с триггерами или каскадными удалениями (а возможно, и с комбинацией того и другого).Можете ли вы солгать TPTB?Применяется ли правило "то, чего они не знают, вам не повредит"?

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top