Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удаление записей из связанных таблиц [D7]


Страницы:   1 2 3

Андрей (начинающий) ©   (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]
> К тому же мертвая.

Почему? Из-за того, что не поддерживается создателем компонента?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо