Форум: "Базы";
Текущий архив: 2002.05.27;
Скачать: [xml.tar.bz2];
ВнизРекурсии в триггерах Найти похожие ветки
← →
blankalex (2002-04-30 11:37) [0]Подскажите, есть ли ограничения на вызов триггера?
А именно, есть порядковый номер для отображения записи (Оговорюсь сразу, что индексы не подходят, т.е. все отображение накладывается на древовидную структуру, что имеет свои алгоритмы выборки, т.о. номер важен только в пределах своего уровня). При его изменении (т.е. юзер меняет порядок, вставляет запись на конкретный уровень и т.п.) в триггере необходимо найти запись с таким же номером и увеличить его на 1, что соответственно вызовет цепную реакцию. Какие подводные камни здесь есть?
← →
Johnmen (2002-04-30 11:48) [1]Скажу в общем и целом :
Указанная организация БД - тяжелое наследие локальных баз.
Если мой совет интересен, то настоятельно рекомендую отойти от этой идеологии и для каждого уровня иерархии строить соответствующую таблицу....
← →
BlankAlex (2002-04-30 11:53) [2]> Johnmen
Уважаю Ваше мнение, но если:
а) заранее неизвестна вложенность,
б) по всем уровням необходимо осуществлять поиск, подсчеты и т.п.
в) и т.п. ...
Боюсь, что при этом подходе а) в хранимых процедурах я явно не смогу указать имена этих таблиц б) сервер решит, что я кретин
← →
roottim (2002-04-30 11:53) [3]>вызов триггера?
непойдет!...
триггером тут не поможеш!
для некоторой вставки.. или переноса уровня необходимо писать ХП.. и на уровне ее делать перенумеровку!
← →
BlankAlex (2002-04-30 11:57) [4]> roottim
Сначала так и делали, но при этом необходимо было искать все записи, номера к-х были больше нового. Для ускорения при удалении номера не пересчитывали. Таким образом возникали дыры. Триггер дает возможность найти конкретную запись с имеющимся номером и не пересчитывать все номера вниз, при наличии дыр
← →
roottim (2002-04-30 12:01) [5]говорю не получится с триггером..
пример!..
скажем стоит триггер на табл t1... делаем там перенумеровку скаже с помощью ХП... она вызывает в свою очередь снова триггер.. и тп...
в рез-те ничего не будет!... так триггера не работают.. у них нет вложенности!...
это нужно делать ТОЛЬКО на уровне ХП!... простым хотябы апдейтом!
← →
Johnmen (2002-04-30 12:02) [6]>BlankAlex ©
Понимаю твои трудности...(вот здесь плавно переходим на "ты" ;-)))
Ну что ж...В этой ситуации всплывут ( :) ) подводные камни при многопользовательской работе...Придется тщательнейшим образом продумывать построение триггеров и ХП...
← →
BlankAlex (2002-04-30 12:15) [7]> roottim
В том то идело, что пытаюсь отказаться от х.п. на перенумерацию вовсе. Просто в х.п. на вставку присваиваю новый номер, а дальше работает триггер:
CREATE TRIGGER A_SRF_VR_BU0 FOR A_SRF_VR
ACTIVE BEFORE UPDATE POSITION 0
as
declare variable find_id integer;
begin
if (new.number <> old.number)
then begin
find_id = null;
select s.id from a_srf_vr s where s.number = new.number
into :find_id;
if (not find_id is null) then update a_srf_vr s
set s.number = s.number + 1 where s.id = :find_id;
end
End
Триггер умер на 800 записях
> Johnmen
Теорию блокировки разработал. Таблица иерархии состоит всего из трех полей. Т.е. изменения в ней происходят только при изменении иерархии и она не завязана на другие изменения, вносимые юзером. Блокирую родительские узлы и т.п. А все остальные х.п. в обязательном порядке уже проверяют наличие и местоположение конкретного узла при updat-ах. Т.к. иерархия все -равно отображается в TreeView, посадил изменения структуры на "короткие" транзакции. Все равно эти действия довольно редкие
← →
kaif (2002-04-30 12:25) [8]Я не понимаю. Неужели так важен порядок внутри одного уровня? Если от этого отказаться и обойтись структурой:
ID
PARENT_ID
NAME
то никакой необходимости перенумеровывать, устранять дыры и т.п. не будет.
При выборке уровня использовать
SELECT * WHERE PARENT_ID = :PARENT_ID
ORDER BY NAME
и все тут.
Либо Вы делаете систему с "суммированиями", "отчетами", частыми вставками и удалениями, с работой в сети и с простой структурой, либо делаете
ID
PARENT_ID
NUMBER_IN_THE_FOLDER
NAME
(гораздо более сложный случай, требует специальных процедур сдвига номеров внутри папки), но тогда давайте работать с редкими изменениями и, желательно, чтобы их делал 1 юзер.
Структуры других типов, типа:
COMPLEX_NODE_NUBER NAME
1.100.200.1.300 "Вася"
вообще не подходят. Ничего, кроме гимора тут не предвидится.
Если же очень уж хочется удалять какие-то дыры, то на самом деле можно использовать ХП с FOR SELECT ... DO, и с обходом задом наперед, иначе индексы ругаться будут.
А без индексов работать вообще НЕЛЬЗЯ, если уж мы SQL-ом занимаемся.
← →
BlankAlex (2002-04-30 12:28) [9]> kaif
Да, по постанове задачи данные должны отображаться в определенном порядке, зависящем только от закачанных данных и дальнейшего выбора юзера, т.е. второй случай.
← →
roottim (2002-04-30 12:31) [10]> kaif © (30.04.02 12:25)
это все правильно!... нельзя переделать то что уже на 2/3 сделано!... естьвременные рамки... предполагаю что в этом сл так и есть...
> BlankAlex © (30.04.02 12:15)
> Триггер умер на 800 записях
проверь на малом количестве.. для эксперимента..
← →
BlankAlex (2002-04-30 12:40) [11]> roottim
Именно так и делал, 700 прошло
← →
kaif (2002-04-30 12:59) [12]Вы можете блокировать триггер при рекурсивнов вызове, используя значение генератора.
Создайте генератор
CREATE GENERATOR MY_TRIGGER_LOCK;
В триггере пропишите
IF (GEN_ID(MY_TRIGGER_LOCK, 0) = 0) THEN
BEGIN
SET GENERATOR MY_TRIGGER_LOCK TO 1;
/*.....основной код */
SET GENERATOR MY_TRIGGER_LOCK TO 0;
END
Тогда рекурсивного вызова не произойдет, так как генераторы находятся вне транзакций.
← →
roottim (2002-04-30 13:02) [13]700 прошло!.. в см обновило ?
тогда размеры стека надо смотреть
← →
Alexandr (2002-04-30 13:03) [14]2kaif: А влучае многопользовательской работы будет кирдык. генератор-то на всех один...
← →
Johnmen (2002-04-30 13:03) [15]>kaif © (30.04.02 12:59)
Начнется полный бардак в многопользовательском режиме !
← →
kaif (2002-04-30 13:07) [16]Да тут задача как-то плохо поставлена, IMHO.
У меня такое ощущение, что народ с самого начала пошел не по лучшему пути...
Вообще с деревьями нужно очень аккуратно все продумывать...
А с генератором, я так в виде соломинки для утопающих. В принципе, можно и генераторы временные делать. Каждому юзеру свой. Если это спасет вообще...
← →
kaif (2002-04-30 13:11) [17]Вообще, я не очень хорошо понимаю, что тут спрашивают. Что значит
>все отображение накладывается на древовидную структуру
Как это? Где накладывается и каким способом?
← →
BlankAlex (2002-04-30 13:50) [18]> kaif
Отображение данных в виде дерева, с помощью TreeView
← →
BlankAlex (2002-04-30 13:52) [19]> roottim
Pls, конкретнее про стек
← →
roottim (2002-04-30 14:36) [20]конкретнее не могу!.. так с ибазами в данный момент не работаю...
надо покопаться в настройках сервера... и в доках!...
мб что и не настраеваемый стек... хз...
у меня был случай.. похожий... но не с деревом.. а скажем просто с одной веткой... я все сделал на уровне ХП.. и то потому что им нужно было чтобы ид шел в порядке 1234... юзвери вообщем..
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.05.27;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.006 c