Порядок выполнения триггеров DB2 - PullRequest
0 голосов
/ 08 ноября 2018

Учитывая ....

CREATE PROCEDURE NotaRandomUpdate (@table1_id INT, @new_value INT)
AS
BEGIN
    begin transaction
        UPDATE  Table1
        SET     field1 = @new_value
        WHERE   id = @table1_id

        INSERT INTO Table2 VALUE(@new_value)
    end transaction
END

В вышеупомянутой (очень) упрощенной ситуации, если есть 2 отдельных триггера, по одному на каждую из таблиц Table1 и Table2, какой триггер будет выполнен 1st?

Я хочу взять объединенный результат полной транзакции (с информацией, на которую нет ссылки в самой транзакции), и сохранить этот объединенный результат где угодно - поэтому мне нужно вывести данные из объединения Table1 => Table2.

Если Table1-Trigger выполняется 1-ым, то я столкнулся с отсутствием данных (в этом случае) из Table2.Если Table2-Trigger выполняется 1-й, то я сталкиваюсь с отсутствием необходимых данных (в этом случае) из Table1.

Я предполагаю, что триггеры выполняются только во время / после фазы фиксации .... или онивыполняется немедленно после выполнения инструкций Table1-update и Table-insert, и, таким образом, все обновления базы данных заключаются в полную транзакцию?

Это должно произойти в базе данных DB2.

решение возможно?Или я столкнулся с выполнением действия «некоторое время спустя» (например, pre-EOD), которое выполняет запрос, который объединяет 2 таблицы после завершения всех соответствующих обновлений (для этого дня), при условии, конечно, что каждая из таблиц Table1 и Table2есть столбцы меток времени, которые можно отслеживать.

end

1 Ответ

0 голосов
/ 08 ноября 2018

Любые релевантные триггеры для Таблицы 1 сработают перед любыми релевантными триггерами в Таблице 2, при условии отсутствия отката.

Db2 триггеры выполняются с инструкциями Insert или Update или Delete, для каждой строки или для каждой инструкции. Следовательно, операторы внутри тела триггера будут выполняться (при условии, что триггер действителен) во время выполнения оператора триггера. Фиксация не вызовет логику триггера.

Каждый из ваших операторов Insert / Update / Delete, которые выполняются, будет выполнять любые соответствующие допустимые триггеры во время выполнения этого оператора до того, как начнется выполнение следующего оператора.

...