Бесконечный цикл запуска - PullRequest
4 голосов
/ 27 ноября 2009

У меня есть триггер после обновления / вставки для таблицы x. В этом триггере мне нужно проверить, обновлен ли определенный столбец, что достаточно просто сделать сравнение удаленной / вставленной таблицы. Однако, если определенный столбец был изменен на определенное значение, мне нужно обновить вставленную строку в таблице x. Это, очевидно, создает цикл. Проблема в том, что мне не повезло, что я зациклился на старте триггера.

Я использую SQL ниже, извиняюсь за ужасное имя временной таблицы.

FOR INSERT, UPDATE
AS 
BEGIN

SELECT  i1.wo_id,
        i1.wo_status,
        i1.wo_link_type,
        i1.wo_link 
INTO    #x_MLN16901 
FROM    inserted AS i1
WHERE   i1.wo_status = 7

DELETE 
FROM    #x_MLN16901 
WHERE   #x_MLN16901.wo_id IN
            (
            SELECT  d1.wo_id
            FROM    deleted AS d1
            WHERE   d1.wo_status <> 7 OR
                    d1.wo_link_type <> 'PM'
            ) OR
        #x_MLN16901.wo_id IN
            (
            SELECT  i2.wo_id
            FROM    inserted AS i2
            WHERE   i2.wo_link_type <> 'PM'
            )


IF  (SELECT COUNT(*) FROM #x_MLN16901) = 0
    RETURN

UPDATE  workorders
SET     workorders.wo_action_date = GETDATE()
WHERE   workorders.wo_id IN
            (
            SELECT  wo_id
            FROM    #x_MLN16901
            )

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

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

Любая помощь очень ценится. Tommy

Ответы [ 2 ]

2 голосов
/ 27 ноября 2009

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

Синтаксис for update of <field1>, <field2>, .... См. Документацию Oracle .

0 голосов
/ 27 ноября 2009

Разве вы не можете «отключить» рекурсивный триггер, прежде чем обновите значение в основной таблице, вызвав первоначальный триггер?

Я верю, что ты можешь.

Взгляните на это на вторичном триггере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...