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

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

Удаление древ. структуры [D5, IB5.x]


Tup ©   (2004-05-14 12:47:00) 

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

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

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


Johnmen   (2004-05-14 13:43:00) [1]

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


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

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


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


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


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


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


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

exception <exception_name> <custom_excpt_text>

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


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


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


Vlad   (2004-05-14 13:17:00) [4]

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


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

Vlad


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


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


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


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

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


Vlad   (2004-05-14 13:15:00) [7]


> Tup   (14.05.04 13:14) [9]

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


Tup   (2004-05-14 13:14:00) [8]

Digitman

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


jack128   (2004-05-14 13:12:00) [9]


> Digitman ©   (14.05.04 13:02)


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


Digitman   (2004-05-14 13:02:00) [10]


> Курдль ©   (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:00) [11]

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


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


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


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


> [3] Tup

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


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

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


jack128   (2004-05-14 12:50:00) [15]

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


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


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

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


Наверх

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