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

Вниз

Рекурсии в триггерах   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.011 c
1-88419
sj
2002-05-17 09:30
2002.05.27
Динамический массив как выходной параметр процедуры


3-88367
Георгинчик
2002-05-02 14:02
2002.05.27
Подскажите, как ускорить следующую операцию. Копирую изтаблицы


1-88393
OLa
2002-05-15 07:05
2002.05.27
Снова Qreport!!!!


3-88353
Gnom
2002-04-29 21:52
2002.05.27
Как засунуть произвольный файл в БД?


1-88448
rvs
2002-05-15 12:48
2002.05.27
О параметрах. Вопрос чайника