powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Зацикливаются тригеры
5 сообщений из 5, страница 1 из 1
Зацикливаются тригеры
    #32041795
VU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VU
Гость
Подскажите плиз как сделать или где найти информацию по следующему
вопросу:

Есть две таблицы:

т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
вызывается апдэйт и т.д... Интербэйз обрывает все связи на
клиента, вызвавшего эти тригеры (типа самозащита:) или глюк).

Огромная просьба помогите мне как это обойти, причем желательно,
чтобы изменения в шапке обнуляли в всю табличную часть.
...
Рейтинг: 0 / 0
Зацикливаются тригеры
    #32041879
oleg_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, я начал бы с простого:


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 .....
...
Рейтинг: 0 / 0
Зацикливаются тригеры
    #32042234
VU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VU
Гость
НЕ КАНАЕТ :(((

Дело в том, что присваиавиние new.export_data='01.01.2000'
судя по всему не выставляет значение "сразу", т.е. дальнейшие проверки не срабатывают и происходит зацикливание

Где вообще можно почитать о точном механизме срабатывания и работы триггеров.
...
Рейтинг: 0 / 0
Зацикливаются тригеры
    #32042241
VU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VU
Гость
Также еще пробовал разнести часть присваивания export_data=
и апдэйт запрос в разные апдэйты - до и после соответственно.

Так сделал в обеих таблицах, вылетает с ошибкой "update conflicts with concurrent updates", наверное сродни concurrent transactions, но мне от этого не легче:)
Это уже типа должно быть лучше, т.к. раньше при зацикливании сервер падал и его гваридиан перезагружал:)
...
Рейтинг: 0 / 0
Зацикливаются тригеры
    #32042325
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обойти можно очень просто - создай таблицу с одним полем и одной записью - флажком и сбрось его изначальнонапример в 0.
В триггере 1-й таблицы вызывай update для второй таблицы только когда флажок сброшен.
В триггере для второй таблицы перед началом операции установи флажок, а после окончания - сбрось.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Зацикливаются тригеры
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]