Форум: "Базы";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];
ВнизУдаление древ. структуры Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.034 c