Обнаруживать, когда запись вставляется или обновляется в материализованном представлении оракула

При обновлении существующей записи она удаляется из материализованного представления, а затем снова вставляется?

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

Я работаю с материализованным представлением Oracle. У меня есть триггер вроде:

create or replace trigger my_view_trigger
    after insert on my_materialized_view
    for each row
        begin
            --handle new record
        end;

Я также попытался изменить часть «после вставки» на «после вставки или обновления» и имел тело в блоке «Начало», например:

if inserting then
    --handle new record
elseif updating then
    --handle modification of existing record
end if;

Но каждое обновление воспринималось как вставка. Есть ли способ обнаружить обновления в материализованном представлении?


person spots    schedule 16.05.2014    source источник


Ответы (1)


Вы рассматривали материализованные журналы просмотра? Таблицы мониторинга содержат много заполненных функций, от которых материализованное представление зависит от использования файлов журнала материализованного представления (специально разработанных для этой цели).

Например, у меня есть файл журнала для моей таблицы Oracle Apps, inv.mtl_system_items_b.
Затем, если я хочу отслеживать изменения DML в таблице, я просто запрашиваю файл журнала:

 SELECT m_row$$
FROM INV.MLOG$_MTL_SYSTEM_ITEMS_B
WHERE DMLTYPE$$ = 'I'
AND SNAPTIME$$ >= TRUNC(sysdate));

Файл журнала отслеживает тип DML с помощью столбца DMLTYPES $$ (I для вставки, U для обновления, ...).

Теперь предположим, что я хочу знать, какие именно записи вставляются сегодня, я мог бы сделать что-то вроде этого:

   SELECT *
FROM INV.MTL_SYSTEM_ITEMS_B
WHERE rowid IN
  (SELECT m_row$$
  FROM INV.MLOG$_MTL_SYSTEM_ITEMS_B
  WHERE DMLTYPE$$ = 'I'
  AND SNAPTIME$$ >= TRUNC(sysdate)
  )

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

Что касается триггеров для материализованных представлений, есть несколько проблем:

-Oracle обычно не рекомендует этого (см. Документацию по триггерам), за исключением обновляемых материализованных представлений.

-Обновление строки в материализованном представлении может быть выполнено как DELETE + INSERT

См. Запись Тома Кайта по этому поводу (https://asktom.oracle.com/pls/apex/f?p=100:11:0%3a%3a%3a%3aP11_QUESTION_ID:672989600346945045).

Как правило, это не рекомендуется.

person Patrick Bacon    schedule 16.05.2014
comment
Для триггеров в обычных таблицах я могу легко определить, является ли данная запись вставкой или обновлением - почему это ВСЕГДА вставка для материализованных представлений? - person spots; 16.05.2014
comment
Можете ли вы подтвердить, есть ли у вас быстрый, полный или принудительный подход к обновлению вашего материализованного представления? Судя по вашему описанию, это звучит как полный подход (где он усекается во время процесса обновления). - person Patrick Bacon; 16.05.2014
comment
У меня есть способ быстрого обновления материализованного представления. Я не согласен с тем, что предложенное вами решение решает мою проблему, просто кажется странным копаться в журналах материализованных представлений, когда в других обстоятельствах я могу использовать их при обновлении. - person spots; 16.05.2014
comment
Смотрите мои обновления к моему ответу. Ваша интуиция относительно вставок, приводящих к сценариям удаления + вставки, может произойти. - person Patrick Bacon; 16.05.2014