2012-02-26 3 views
0

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

Я хочу, чтобы триггер проверял условие в каждой строке таблицы. Я хочу сказать, что я хочу, чтобы условия триггера проверяли все значения в таблице и находили, если один из них равен введенному НОВОМ значению. Что-то вроде этого:

WHEN(NEW.fecha_foto = fecha_foto)AND... 

Где fecha_foto - любое значение в таблице.

Возможно ли это?

Спасибо.

+1

Это невозможно, и это не очень желательно. почему ты хочешь сделать это? – APC

+0

У меня есть таблица с строками трафика, и я хочу проверить время между новой строкой и предыдущей. – Nausikaa

+2

какую бизнес-логику вы пытаетесь реализовать? – APC

ответ

1

Триггер, который выдает DML (включая SELECT) в ту же таблицу, которая владеет триггером, вызывает призрак ORA-4091, исключение мутирующей таблицы. Oracle бросает эту ошибку, потому что ожидает, что результат транзакции будет детерминированным, а триггер, который выдает DML в своей собственной таблице, вводит неопределенность в процесс.

Mutating table - надежный индикатор плохой конструкции, в частности, плохая модель данных и, похоже, здесь.

Если значение штрафа зависит от результата одного наблюдения, то для FINE это нормально, если столбец таблицы НАБЛЮДАТЕЛЬ. Однако ваши бизнес-правила показывают, что значение может зависеть от нескольких наблюдений, если они попадают в определенный период. В этом случае штраф должен быть в отдельной таблице. Вам понадобится внешний ключ между OBSERVACION и MULTA, чтобы указать, какие наблюдения покрываются конкретным штрафом.

+0

Я, наконец, решил представить данные, которые хочу сравнить во временной таблице. – Nausikaa

+0

Чтобы быть откровенным, это звучит как нечто большее, чем правильное решение. – APC