![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаление записей из связанных таблиц [D7]
Андрей (начинающий) © (2009-04-19 12:45:00)Есть 2 таблицы. Связь "Один ко многим" (т.е. одной записи первой таблицы соответствуюет множество записей во второй). Как правильно удалять запись из первой табл. и соответствующие ей записи второй?
Таблицы не индексированы. Что лучше использовать: Locate или Next?
MsGuns (2009-04-24 09:24:00) [21]Поддерживаю Егу на счет "вредности" каскадных удалений на уровне бизнес-логики. В конкретном приложении с аккуратной логикой и "заворачиванием" удалений в транзакции - пожалуйста, а вот в триггер - ни боже мой. Чревато Чернобылем для БД.
Как быть с предупреждениями, если делается удаление из связанных таблиц по некоторому доп.условию, т.е. когда удаляется несколько (заранее неизвестно сколько) из главной и есно, все семейства записей из подчиненной ? На каждый пук запрос ? А если это удаление делается клиентским запросом, ничего не ведающем о каскадах ? И каким образом сервер будет вести диалог с пользователем ?
Anatoly Podgoretsky (2009-04-23 21:40:00) [22]Вариант 2, копия таблиц, разновидность первого варианта.
Anatoly Podgoretsky (2009-04-23 21:37:00) [23]Создание временной таблице, в случае ошибки откат из нее.
Андрей (начинающий) (2009-04-23 21:15:00) [24]
> Андрей (начинающий) (22.04.09 09:42) [5]
И все-таки, абстрагируясь от развернувшейся теоретической дискуссии, ответьте, плиз, на мой вопрос [5] :)
Anatoly Podgoretsky (2009-04-22 14:25:00) [25]> Ega23 (22.04.2009 14:18:21) [21]
В отличии от все откатится и так, особенно учитывая strict delete
Anatoly Podgoretsky (2009-04-22 14:23:00) [26]
> Почему? Из-за того, что не поддерживается создателем компонента?
И продавцом и автором.
Anatoly Podgoretsky (2009-04-22 14:22:00) [27]Да хоть каскадное удаление (автоматическое), хоть ручное ни сути ни результата не меняет. Важно понимание, что кроме родительской будут удалены подчиненые.
Юрий Зотов (2009-04-22 14:20:00) [28]> Ega23 © (22.04.09 14:18) [21]
> поднялся бы exception
Не факт. Например, при репликации контроль foreign keys может быть отключен.
Ega23 (2009-04-22 14:18:00) [29]
> 1. И обязательно забыл бы удалить какую-то из ссылок.
Если бы забыл - поднялся бы exception и транзакцию можно было бы откатить.
В отличие от.
> 2. И переписывал бы свою ХП при изменении структуры БД.
НЕ вижу причин, почему в патч-скрипт на изменение структуры БД не включить пересоздание нужной ХП.
> 3. И при каждой переписке снова забывал бы удалить какую-
> то из ссылок.
Если бы снова забыл - снова поднялся бы exception и транзакцию можно было бы откатить.
В отличие от.
Юрий Зотов (2009-04-22 14:05:00) [30]> Ega23 © (22.04.09 13:57) [19]
> Хотя я бы в ХП обернул и один фиг ручками бы выполнил.
1. И обязательно забыл бы удалить какую-то из ссылок.
2. И переписывал бы свою ХП при изменении структуры БД.
3. И при каждой переписке снова забывал бы удалить какую-то из ссылок.
Ega23 (2009-04-22 13:57:00) [31]Если как - то delete cascade
Хотя я бы в ХП обернул и один фиг ручками бы выполнил.
Юрий Зотов (2009-04-22 13:53:00) [32]> Ega23
> А как ты предупреждение-то собираешься выводить? Типа, "Вы
> уверены?" и всё?
Не все, а с пояснением. Чтобы юзер понимал, что он собирается сделать и к чему это приведет.
> Меня бы за такое убили.
Еще раз - все надо делать с головой. В том числе, и каскадное удаление. В каких-то ситуациях оно действительно недопустимо, а в других может быть вполне возможно.
=======================
Но ты не о том говоришь, Олег. Если прочитать сабж внимательно, то мы увидим, что человек УЖЕ решил делать каскадное удаление и спрашивает лишь о том, КАК его сделать. И мой ответ свелся лишь к тому, как сделать ЛУЧШЕ, чтобы ничего не упустить из виду и не писать лишний код.
Ega23 (2009-04-22 13:51:00) [33]
> Сначала предложить пользователю удалить соответствующие
> данные из связанных таблиц?
Да. Ответить, что, мол, удаление невозможно. А в критических случаях - ещё и указать из-за какой сущности невозможно.
AndreyV (2009-04-22 13:47:00) [34]> [15] Ega23 © (22.04.09 13:34)
> Меня бы за такое убили.
Сначала предложить пользователю удалить соответствующие данные из связанных таблиц?
Ega23 (2009-04-22 13:34:00) [35]Меня бы за такое убили.
Ega23 (2009-04-22 13:34:00) [36]А как ты предупреждение-то собираешься выводить? Типа, "Вы уверены?" и всё?
Юрий Зотов (2009-04-22 13:25:00) [37]> Ega23 © (22.04.09 13:07) [12]
> И код клиента (либо ХП, которая с данной сущностью работает) мне
> придётся переписывать.
Зачем? Добавляй хоть 100 таблиц - все равно при удалении записи из справочника автоматически будут удалены все ссылающиеся на нее записи из всех таблиц, в том числе и из этих 100 новых. Без всякой переписки.
Ega23 (2009-04-22 13:07:00) [38]
> Если с головой не дружить - то можно. А если дружить и сделать
> все аккуратно (с выдачей предупреждения и т.п.), то все
> будет нормально. И ссылочная целостность будет гарантирована
> даже при возможных будущих изменениях в структуре БД, причем
> без переписки кода клиента.
Ага, щаз. Вот я добавляю новую таблицу (ну вот надо мне). Ставлю вторичный ключ на справочную. С опцией on delete cascade.
И код клиента (либо ХП, которая с данной сущностью работает) мне придётся переписывать.
Юрий Зотов (2009-04-22 12:38:00) [39]> Ega23 © (22.04.09 10:02) [6]
> Одним удалением можно всю базу грохнуть.
Если с головой не дружить - то можно. А если дружить и сделать все аккуратно (с выдачей предупреждения и т.п.), то все будет нормально. И ссылочная целостность будет гарантирована даже при возможных будущих изменениях в структуре БД, причем без переписки кода клиента.
Андрей (начинающий) (2009-04-22 12:25:00) [40]
> Anatoly Podgoretsky © (22.04.09 11:10) [9]
> К тому же мертвая.
Почему? Из-за того, что не поддерживается создателем компонента?