68 / 8 / 1
Регистрация: 14.03.2013
Сообщений: 116
1

Каскадное удаление при передаче обновлений в базу данных в случае ограничения типа "слоновье ухо"

23.05.2017, 00:04. Показов 1015. Ответов 7

Author24 — интернет-сервис помощи студентам
Здравствуйте, господа.
Возник вопрос - может кто подсткажет?
В технологии ADO.NET как решается проблема передачи в базу данных КАСКАДНОГО УДАЛЕНИЯ записей из DataTable в случае если в обновляемой таблице организовано ограничение по типу "слоновье ухо", т.е само на себя, когда и первичный ключ таблицы зацеплен на внешний ключ в ЭТОЙ ЖЕ таблице.
Такой тип отношения часто применяют для организации данных типа "дерево структуры", но при этом я испытал трудности с передачей обновлений в базу данных. А именно передается только однократное отношение "родитель-потомок", а каскад дальнейшего уровня для потомков потомка уже не срабатывает.
Как-то решается такая потеха ?
Заранее благодарен за отклик)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.05.2017, 00:04
Ответы с готовыми решениями:

При передаче XDTO пакета из базы в базу ошибка несоответствия типа
Соап отрабатывает сервис без ошибок, все красиво, а вот если его запустить из другой 1ски пишет что...

Entity Framework, как правильно убрать каскадное удаление в моем случае?
public class Task : BaseIntity { public string Name {...

Проблемы при передаче данных из формы на странице в Базу данных
(ASP.NET + MySql) У меня есть на странице текстбокс. Я ввожу туда слово кириллицей и после этого...

При передаче данных по локальной сети на сервер в базу sql передается только часть данных
Всем доброго времени суток! У меня ситуация такая – есть своя программа на Delphi 2010 для...

Спец символы при передаче данных в базу
Все доброго, Приложение на J2EE передает данные в базу, если в стринговое поле ввести спец...

7
307 / 248 / 40
Регистрация: 28.09.2013
Сообщений: 600
25.05.2017, 19:40 2
Цитата Сообщение от Bars4 Посмотреть сообщение
потомков потомка уже не срабатывает
Вау... После такого моцк тоже не очень срабатывает. Приведите плз диаграммы для ясности, а то че т на слух не очень воспринимается...
0
68 / 8 / 1
Регистрация: 14.03.2013
Сообщений: 116
26.05.2017, 17:07  [ТС] 3
Добрый день.
Вот прикрепляю предметную схему данных с условным именованием таблиц 1, 2 и 3, а так же условным именованием DataRelation 1-1, 1-2, 2-2 и 2-3:
Каскадное удаление при передаче обновлений в базу данных в случае ограничения типа "слоновье ухо"
.
Красными стрелками продублировал DataRelation которые наложены на столбцы таблиц.
Всем DataRelation назначено каскадное удаление.
Фишка в том, что когда удаляется строка из Таблицы1, то сраватывает каскадное удаление всех зависимых дочерних строк по отношению 1-1 в самой родительской таблице1 (SAME TABLE FOREIGN KEY), а так же подчиненных строк по отношению 1-2 в таблице2 И ПЛЮС каскадные удаления по отношению 2-2 в таблице2 и ПЛЮС каскады по отношению 2-3.
Таким образом в отношении Таблицы2 возникает попытка дважды каскадного удаления дочерних строк - со стороны DataRelation 1-2 и со стороны DataRelation 2-2. Как следствие это приводит к попытке удаления уже ранее удаленных другим DataRelation строк.
Если из таблицы1 за одну транзакцию удаляется большое количество подчиненных строк (300 и более), то весь DataSet погружается в большую задумчивость.
Что тут можно бы предпринять по реализации лучшего быстродействия и обхода описанных ошибок.
З.ы.: я организовал проверку состояния удаляемых строк на предмет RowState <> DataRowState.Deleted, но это все работает МЕДЛЕННО.
0
117 / 110 / 31
Регистрация: 05.04.2014
Сообщений: 224
26.05.2017, 17:25 4
Если не ошибаюсь, то каскадное, как и любое другое удаление выполняется через передачу запроса в базу данных.
Запрос нужно сформировать таким образом, чтобы база данных его правильно обработала.
К разделу VB.NET вопрос мало относится.
Думаю, больше ответов можно получить тут: https://www.cyberforum.ru/database/
0
68 / 8 / 1
Регистрация: 14.03.2013
Сообщений: 116
26.05.2017, 17:52  [ТС] 5
Bidgo, возможно Вы правы
Тогда вопрос: а если я случайно прихватил и удалил "не ту" строку, а изменения уже "ушли" в БД. Тогда потребуется запускать целый откат транзакций из Базы с учетом сложно подчиненных связей данных. Это ли считается эффективный подход к использованию БД?
Просто тут https://www.cyberforum.ru/database/ я не нашел раздел по ADO.NET.
Может Админы перенесут мою тему по назначению ? Буду очень благодарен
0
1148 / 903 / 153
Регистрация: 25.07.2015
Сообщений: 2,032
26.05.2017, 20:12 6
Цитата Сообщение от Bars4 Посмотреть сообщение
я не нашел раздел по ADO.NET
ADO.NET
а если я случайно прихватил и удалил "не ту" строку, а изменения уже "ушли" в БД. Тогда потребуется запускать целый откат транзакций из Базы с учетом сложно подчиненных связей данных. Это ли считается эффективный подход к использованию БД?

Не обязательно.
Во-первых , в ADO.NET данные можно удалять как напрямую (сразу) , так и с откатом транзакции.
А во-вторых , вы всегда можете не удалять данные сразу , а только ставить признак на удаление,чтобы
предполагаемые на удаление строки были не видны , но физически удалялись бы через дополнительный интерфейс. ))
1
68 / 8 / 1
Регистрация: 14.03.2013
Сообщений: 116
26.05.2017, 21:40  [ТС] 7
Kulma, спасибо за ссылку)
Вы все пишете правильно - я с Вами согласен.
Вот в процессе выполнения по варианту "во-вторых":
1) из-за описанной мной выше специфики наложенных ограничений в процессе, когда DataRelation отрабатывает каскадную "пометку" дочерних строк на удаление, возникает исключение типа "Необработанное исключение типа "System.Data.DeletedRowInaccessibleException" в System.Data.dll: Дополнительные сведения: Невозможно удалить эту строку, т.к. она уже удалена.";
2) при количестве помечаемых на удаление таким образом дочерних строк 300+ начинает проявляться заметная задумчивость процесса... - видимо из-за того, что каждая строка проходит проверку на целостность данных. Мне кажется не должно удаление строк работать так медленно;
3) при фиксации произведенных в DataSet изменений, путем отправки обновлений в БД, для связей "слоновье ухо" (или как их там еще правильно называют?), представленных на схеме типа 1-1 и 2-2, SQLServer не обрабатывает всю цепочку вложенности, а обрабатывает только один первый уровень "родитель-потомок".
Но по пункту 3) это я уже выяснил, что это специфика SQLServer и она решается посредством дополнительной хранимой процедуры, триггера или тому подобное.
А вот пункты 1) и 2) для меня остаются открытыми.
З.ы.: хотел уточнить, по поводу:
Цитата Сообщение от Kulma Посмотреть сообщение
в ADO.NET данные можно удалять как напрямую (сразу)
Всегда думал, что в ADO.NET работает только изложенный Вами второй вариант ?
0
1148 / 903 / 153
Регистрация: 25.07.2015
Сообщений: 2,032
26.05.2017, 22:44 8
Цитата Сообщение от Bars4 Посмотреть сообщение
Всегда думал, что в ADO.NET работает только изложенный Вами второй вариант
Да что вы ))
Например самая распространённая конструкция
VB.NET
1
2
cmd =New SqlCommand("DELETE FROM table1 WHERE field=1",connection)
cmd.ExecuteNonquery
грохает запись сразу же без возможности восстановления

Что же касается основного вопроса , то боюсь я тут вам не смогу помочь, т.к. никогда не
использовал каскадное удаление/обновление , предпочитая прописывать необходимые мне действия
отдельными запросами,через триггеры кстати очень удобно и понятно..для меня во всяком случае.
Цитата Сообщение от Bars4 Посмотреть сообщение
что это специфика SQLServer
В MySql ,к слову, те же проблемы периодически возникают .
В общем этот механизм для меня не очевиден, от того и не востребован .
Цитата Сообщение от Bars4 Посмотреть сообщение
видимо из-за того, что каждая строка проходит проверку на целостность данных
Думаю , что здесь вы абсолютно правы.
Кстати вы можете посмотреть план выполнения запроса и определить , где возникают тормоза.
1
26.05.2017, 22:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.05.2017, 22:44
Помогаю со студенческими работами здесь

NullReferenceException при передаче данных из формы в базу и datatable
Доброго времени суток уважаемые форумчане! Не судите строго, первый раз задаю вопрос на подобном...

Каскадное удаление данных
Дайте пожалуйста ссылку на ресурс где описано как сделать каскадное удаление даанных, или опишите...

Каскадное удаление данных в таблицах
доброго времени суток! птички обеспечения целостности данных неактивна, каскадное обновление и...

Каскадное удаление данных в БД Access
Добрый день форумчане. У меня есть небольшая проблема. Есть две связанные между собой таблицы по...

Не работает каскадное удаление данных
Доброго времени суток. Есть две таблицы, в одной таблице хранятся данные о документе, а во второй...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru