Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.01 c
1-88434
Бывалый
2002-05-17 12:11
2002.05.27
TAdvStringGrid - центрирование ячеек.


1-88499
Олег Лаукарт
2002-05-11 14:44
2002.05.27
показ html текста ..


14-88606
ProgMan
2002-04-17 11:18
2002.05.27
Погиб Форум.


3-88320
Hamster
2002-04-30 08:37
2002.05.27
Списание.


1-88472
VicV
2002-05-17 23:02
2002.05.27
Как отключить эти 3 кнопки на форме (закрыть, свернуть, востан.)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский