![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаление древ. структуры [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]
> внешний ключ делай с каскадным удалением. Тогда при удалении
> родителя удалятся все дети
Да? Что-то я не уверен...