Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.06;
Скачать: CL | DM;

Вниз

Удаление древ. структуры   Найти похожие ветки 

 
Tup   (2004-05-14 12:47) [0]

Здравствуйте!

У меня в базе хранится древовидная структура в виде записей где поле PRE указывает на ID родителя. Есть ли готовая процедура по удалению всех элементов определенной ветки ??? То есть я хочу удалить ветвь и мне нужно вместе с ней удалить всё что в неё входит.

Помогите, пожалуйста !


 
jack128 ©   (2004-05-14 12:50) [1]

внешний ключ делай с каскадным удалением. Тогда при удалении родителя удалятся все дети


 
Курдль ©   (2004-05-14 12:50) [2]


> внешний ключ делай с каскадным удалением. Тогда при удалении
> родителя удалятся все дети

Да? Что-то я не уверен...


 
Tup   (2004-05-14 12:56) [3]

А в InterBase это есть ????


 
Соловьев ©   (2004-05-14 12:57) [4]


> [3] Tup

триггер на удаление


 
jack128 ©   (2004-05-14 12:58) [5]


> Да? Что-то я не уверен...
а ты проверь и убедись ;-))


 
Digitman ©   (2004-05-14 13:02) [6]


> Курдль ©   (14.05.04 12:50) [2]


почему не уверен ?


> Tup   (14.05.04 12:47)  


как вариант без использования внеш.ключа с каскадным удалением, можно в триггере BEFORE DELETE выполнить код вида

IF (можно_удалять_данный узел) THEN
DELETE FROM MyTable WHERE Pre = old.ID; /* попытаться сначала удалить дочерние узлы */
ELSE
EXCEPTION "Фигвам ! Нельзя удалять узел " || cast(old.ID as строка) "!";


 
Tup   (2004-05-14 13:02) [7]

А что в тригере писать то ??? :((


 
jack128 ©   (2004-05-14 13:12) [8]


> Digitman ©   (14.05.04 13:02)


> EXCEPTION "Фигвам ! Нельзя удалять узел " || cast(old.ID
> as строка) "!"
это описка или где то такой синтаксис есть? Вроде всегда был exception <exceptio_name> ???


 
Tup   (2004-05-14 13:14) [9]

Digitman

Дело в том что так я удалю только первичные дочерние узлы, но у них тоже есть дочерние ... Тут я думаю должна быть какая-то рекурсивная процедура и я подозреваю что это стандартная вещь... вот только найти не могу :(((


 
Vlad ©   (2004-05-14 13:15) [10]


> Tup   (14.05.04 13:14) [9]

Это как раз нестандартная вещь.
Должна быть именно рекурсивная ХП. Писать естественно самому.
Можешь в инете поискать примеры


 
Соловьев ©   (2004-05-14 13:16) [11]


> узлы, но у них тоже есть дочерние ...

в том и вся фишка - триггер то для всех :)


 
Vlad ©   (2004-05-14 13:17) [12]

Читать тут:
http://www.ibase.ru/develop.htm
раздел "Древовидные и иерархические структуры, хранение объектов"


 
Tup   (2004-05-14 13:17) [13]

Vlad


> Это как раз нестандартная вещь.
> Должна быть именно рекурсивная ХП. Писать естественно самому.
> Можешь в инете поискать примеры


Так я и надеялся что кто-нибудь распологает таким примером или знает где его взять :(


 
Digitman ©   (2004-05-14 13:22) [14]


> jack128 ©   (14.05.04 13:12) [8]


ну это псевдокод, разумеется) ... я не преследовал цели приводить синтаксически корректный код ..


> Вроде всегда был exception <exceptio_name> ???


не всегда ... именно такого синтаксиса, разумеется, нет .. но зато в ФБ с нек.пор допустима конструкция

exception <exception_name> <custom_excpt_text>

и я вообще не понимаю, как по сей день можно париться с очень сырым и ограниченным ИБ5 .. ФБ1.5 давно уже ведет нас к светлому завтра)


> так я удалю только первичные дочерние узлы, но у них тоже
> есть дочерние


ты забыл, что для каждого из удаляемых "прямых дочерних узлов" точно так же возникнет событие-триггер BEFORE DELETE, в котором каждый удаляемый "прямой доч.узел" волен будет точно так же удалить своих наследников, прежде чем будет удален сам


 
Tup   (2004-05-14 13:25) [15]

Digitman
О !! Ты наверное прав ! Я действительно забыл :)
Сейчас попробую.  Спасибо !


 
Johnmen ©   (2004-05-14 13:43) [16]

Только неясно, чем не нравится вариант jack128 ©   (14.05.04 12:50) [1] ?



Страницы: 1 вся ветка

Текущий архив: 2004.06.06;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.043 c
1-1085643388
Fifa
2004-05-27 11:36
2004.06.06
модуль objects.pas


6-1081938722
Andreas
2004-04-14 14:32
2004.06.06
Убрать меню в браузере


6-1082363520
Alex*
2004-04-19 12:32
2004.06.06
Перекодировка


1-1085072921
tyo
2004-05-20 21:08
2004.06.06
Дата и время в DateTimePicker


14-1084551199
Layner
2004-05-14 20:13
2004.06.06
Житель России обратился к Масхадову с просьбой о политическом убе