Управляемая SQL запускает рекурсию - PullRequest
0 голосов
/ 16 января 2011

У меня есть таблица с назначенным ей триггером.И этот триггер изменяет те же данные таблицы.Конечно, это инициирует новый триггер.

Каждый экземпляр триггера знает (есть некоторые правила), должен ли он быть последним в цепочке или нет.И если это необходимо, он должен отключить следующий триггер.

Я вижу следующую проблему: если у меня есть состояние (скажем, флаг остановки), оно может работать неожиданным образом.Например, пользователь меняет таблицу.Новая цепь запуска инициируется.Триггер хочет быть терминатором и установить флаг остановки вверх.В этот момент другой пользователь меняет таблицу => инициируется новая цепочка триггеров, которая должна быть выполнена.Но, когда установлен флаг остановки, он очищает флаг и выходит.Теперь запускается рекурсивный триггер (который, как мы думаем, игнорируется), проверяет, снят ли флаг ... Ой, он выполняется!

Я не знаю, каков порядок в таких случаях,Будет ли рекурсивный триггер выполняться сразу после изменения данных, или родительский триггер будет выполнен первым, поэтому я не знаю, как организовать этот процесс.

С уважением,

1 Ответ

1 голос
/ 16 января 2011

Рассмотрите возможность объединения сложных триггеров и упрощения всего в хранимые процедуры или, если возможно, стандартные операции на основе SQL-набора.

Хранимые процедуры легче понять и поддерживать, чем многие уровни триггеров в данной таблице.Триггеры действительно имеют значение в некоторых сценариях, но если у вас есть триггеры, которые вызывают цепочку триггеров, или у вас есть триггеры, которые зависят от данных, которые пересматриваются другими триггерами, все в одной таблице, тогда вы действительно начинаете испытывать кошмар обслуживания,Упростите в качестве отправной точки либо улучшив операторы SQL update / insert, либо реорганизуйте свои триггеры в какую-то хранимую процедуру.

...