|
Зацикливаются тригеры
|
|||
---|---|---|---|
#18+
Подскажите плиз как сделать или где найти информацию по следующему вопросу: Есть две таблицы: т1 - шапка документов (tabl9) т2 - табличная часть (tabl18) Эти две таблицы нужно экспортировать, причем экспортировать нужно только те данные, которые были изменены или добавлены после последнего эксопрта. Для отслеживания этого момента в таблицы было добавлено поле export_data типа date (экспорт не будет делаться чаще раза в день, InterBase Server&Client версии 5.5) и оно должно обнуляться при изменении (при обнулении я выставляю дату в 01.01.2000) С тригерами before insert тут все просто и понятно (можно и default значение поставить), однако тригеры update (я делаю before update, хотя может я и не прав) вызывают проблемы: В т1 я ставлю тригер before update: if (old.export_data<>'01.01.2000') then new.export_data='01.01.2000'; update tabl18 set isdel=new.isdel where codecap=new.code; Последняя строчка необходима для того, чтобы при удалении шапки (т.е. при удалении всего документа) табличная часть также помечалась на удаление. Таким же образом я могу обнулять и дату табличной части (поле codecap указывает на уникальный код шапки документа в поле code), но не в это проблема: В т2 я также ставлю before update тригер: if (old.export_data<>'01.01.2000') then new.export_data='01.01.2000'; Однако этого недостаточно, т.к. хотелось бы в шапке также отмечать, что произошло изменение и нужно экспортировать документ снова, поэтому если добавить if (old.export_data<>'01.01.2000') then update tabl9 set export_data='01.01.2000' where code=old.codecap; То происходит зацикливание, т.е. вызывается апдэйт в т1, тот в свою очередь обновляет isdelы в т2, т.е. в каждой строчке т2 вызывается апдэйт и т.д... Интербэйз обрывает все связи на клиента, вызвавшего эти тригеры (типа самозащита:) или глюк). Огромная просьба помогите мне как это обойти, причем желательно, чтобы изменения в шапке обнуляли в всю табличную часть. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2002, 12:16 |
|
Зацикливаются тригеры
|
|||
---|---|---|---|
#18+
Ну, я начал бы с простого: if (old.export_data<>'01.01.2000') then update tabl9 set export_data='01.01.2000' where code=old.codecap AND export_data<>'01.01.2000' update tabl18 set isdel=new.isdel where codecap=new.code AND isdel<>new.isdel Что бы небыло попыток обновить уже обновленное. Если триггеры зацикливаются, надо пересмотреть логику. Вынеси update в триггер AFTER UPDATE, или весь триггер переделай на AFTER. Правда в этом случае нельзя писать new.export_data=... а надо "по честному" UPDATE ..... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2002, 15:17 |
|
Зацикливаются тригеры
|
|||
---|---|---|---|
#18+
НЕ КАНАЕТ :((( Дело в том, что присваиавиние new.export_data='01.01.2000' судя по всему не выставляет значение "сразу", т.е. дальнейшие проверки не срабатывают и происходит зацикливание Где вообще можно почитать о точном механизме срабатывания и работы триггеров. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2002, 17:02 |
|
Зацикливаются тригеры
|
|||
---|---|---|---|
#18+
Также еще пробовал разнести часть присваивания export_data= и апдэйт запрос в разные апдэйты - до и после соответственно. Так сделал в обеих таблицах, вылетает с ошибкой "update conflicts with concurrent updates", наверное сродни concurrent transactions, но мне от этого не легче:) Это уже типа должно быть лучше, т.к. раньше при зацикливании сервер падал и его гваридиан перезагружал:) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2002, 17:39 |
|
Зацикливаются тригеры
|
|||
---|---|---|---|
#18+
Обойти можно очень просто - создай таблицу с одним полем и одной записью - флажком и сбрось его изначальнонапример в 0. В триггере 1-й таблицы вызывай update для второй таблицы только когда флажок сброшен. В триггере для второй таблицы перед началом операции установи флажок, а после окончания - сбрось. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2002, 14:28 |
|
|
start [/forum/topic.php?fid=40&msg=32042234&tid=1581208]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
26ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
others: | 263ms |
total: | 379ms |
0 / 0 |