Как да принудите oracle да извърши каскадно изтриване без отпадане/пресъздаване на ограничения

Имам родителска таблица, която има дузина дъщерни таблици, които я препращат. Тези дъщерни таблици на свой ред имат други дъщерни таблици, които ги препращат. И така нататък.

Трябва да изтрия ред от основната родителска таблица, като го каскадирам докрай.

Премахването/пресъздаването на ограничения навсякъде, за да бъдат НА КАСКАДНО ИЗТРИВАНЕ не е опция

Преминаването през всички тях и ръчното изтриване на дъщерни редове е кошмар.

Някакви други опции?


person Community    schedule 14.12.2012    source източник
comment
тригерите валидна опция ли са за вас?   -  person dani herrera    schedule 14.12.2012
comment
@danihp, не, не са. Не мога да променя схемата   -  person    schedule 14.12.2012
comment
Колко реда трябва да изтриете и това ще бъде ли редовна задача?   -  person wolφi    schedule 14.12.2012
comment
@WolfgangFleischmann, дори не знам колко. Това е еднократна задача, просто трябва да тествате необичаен сценарий.   -  person    schedule 14.12.2012
comment
Знаете ли синтаксиса на DELETE FROM (SELECT pid, cid, gid FROM myparent JOIN mychild USING (pid) JOIN mygrandchild USING (cid)) WHERE pid=xxx? Това може би е най-безболезненият начин за изтриване на редовете. Мога да обясня, ако искаш...   -  person wolφi    schedule 14.12.2012


Отговори (2)


Изявлението DELETE няма параметри, които да го направят каскадно.

Така че можете или да направите потребител на ON CASCADE DELETE, или просто да изпълните куп отделни изтривания в правилния ред.

Бихте могли да напишете процедура за „интелигентно изтриване“, която изследва структурата на таблицата и генерира поредица от изтривания на базата на това, но това вероятно ще бъде повече работа и по-скоро кошмар, отколкото писането на отделни изтривания. И вие трябва да имате тези ограничения, за да работи това, което в действителност не винаги е желано.

person GolezTrol    schedule 14.12.2012

Реших този вид проблем в Oracle с приложение, което направих нарочно за обединяване на данни от един клон към друг - цел и след това изтриване на източника.

https://sites.google.com/site/keytreechanger/Home https://sites.google.com/site/keytreechanger/Home/screenshots

цитиране

Като се има предвид тази грешка, например: клиент Pedrus Root (представяне на вътрешен ключ #R=111) е същият като Petrus Root (#R=222). Преместете данни под 222 към 111 и след това изтрийте клон 222.
KTC събира всички данни, свързани с този случай (и следващите няколко случая за разрешаване), по интелигентен начин от всички подходящи таблици на базата данни.
алгоритъмът търси само където е необходимо и използва всички налични ключови компоненти.
Резервно копие на всички данни се поддържа локално за целите на одита. Локалното хранилище се развива прозрачно, за да поеме промените в дефинициите на таблица/поле.

Опитният потребител инспектира визуално дървото на таблицата/релацията и може да преглежда/отпечатва/редактира данни във всяка таблица и по избор да променя предполагаемото действие (изрязване, изрязване и поставяне или готово).
Накрая KTC генерира стотици редове вмъквания , актуализации и изтривания на коригиращ код за разрешаване на този конкретен случай, изброени в подходящ ред, завършващ с
изтриване от rootTable, където #R=222.
След това прилагам кода с потребителите онлайн.

Във вашата ситуация филтърът ще трябва да премахне всички редове, освен изтритите.

AFAIK няма еквивалентно приложение на пазара.

person Helder Velez    schedule 20.10.2013