Oracle: Как выполнить триггер вставки, не задерживая ответ вставки? - PullRequest
3 голосов
/ 07 августа 2009

Триггер ниже задерживает мой ответ вставки. Как я могу предотвратить это?

create or replace
TRIGGER GETHTTPONINSERT
BEFORE INSERT ON TABLENAME
FOR EACH ROW 
Declare
  --   
BEGIN
  -- The inserted data is transfered via HTTP to a remote location
END;

РЕДАКТИРОВАТЬ Люди говорят мне, чтобы я выполнял пакетные задания, но я бы предпочел иметь данные раньше, чем иметь 100% согласованность. Преимущество триггера в том, что это происходит, как только поступают данные, но я не могу позволить себе задержку ответа вставки.

Ответы [ 5 ]

10 голосов
/ 07 августа 2009

Один из подходов состоит в том, чтобы триггер создал dbms_job, который запускается один раз (каждый) раз для выполнения http-передачи. Создание dbms_job относительно быстрое, и вы можете думать об этом как об эффективном параллельном создании нового потока.

См. http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:7267435205059 для получения дополнительной информации - его пример касается отправки электронной почты, но идея та же.

4 голосов
/ 02 ноября 2009

Существует идеальное решение для этой конкретной ситуации, которое называется Уведомление об изменении базы данных.

Вы можете думать об этом почти как асинхронный триггер.

Вы используете пакет DBMS_Change_Notification, чтобы сообщить оракулу, какие таблицы смотреть и что делать, когда происходит изменение. Вы можете следить за DML и DDL, вы можете заставить Oracle пакетировать изменения (т.е. подождать, пока произойдут 10 изменений, прежде чем запускать). Он вызовет sproc с объектом, содержащим все rowids измененных строк ... вы можете решить, как обрабатывать, включая вызов HTTP. Это не должно закончиться для вставки, чтобы принять. Документация для 10gR2

3 голосов
/ 07 августа 2009

Может быть, вы могли бы создать локальную таблицу, в которой хранится информация, которую вы должны передать, и создать задание, которое выполняется каждые X минут. Задание считывается из таблицы, переносятся все данные и удаляются перенесенные данные из таблицы.

1 голос
/ 07 августа 2009

Разве нельзя использовать опции репликации Oracle? Вставленные данные отправляются через http в удаленное местоположение в триггере оператора после или до. Что будет, когда произойдет откат? Ваше сообщение отправки hhtp не будет отменено, поэтому у вас есть противоречивые данные.

0 голосов
/ 07 августа 2009

ну, очевидно, вы можете предотвратить задержку, удалив триггер .... Иначе, триггер ВСЕГДА будет выполнен перед вашей вставкой, вот для чего предназначен TRIGGER BEFORE INSERT.

Или, может быть, вы могли бы дать нам более подробную информацию о том, что именно вам нужно?

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