Oracle Trigger для записи всех вставок / обновлений в файл - PullRequest
5 голосов
/ 10 января 2012

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

Можно ли это сделать?

Ответы [ 3 ]

5 голосов
/ 10 января 2012

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

Информация о пакете UTL_FILE находится здесь: http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/u_file.htm

И документацию по Trigger можно найти здесь: http://docs.oracle.com/cd/B10501_01/appdev.920/a96590/adg13trg.htm

Здесь есть аналогичный ответ на то, что вы ищете здесь: http://bytes.com/topic/oracle/answers/762007-trigger-output-text-file

Подробнее о записи в файл с использованием PL / SQL здесь: http://www.devshed.com/c/a/Oracle/Writing-to-Text-Files-in-Oracle-PLSQL/

Надеюсь, это поможет ...

2 голосов
/ 11 января 2012

Я бы избегал записи в файловую систему во время DML, но извлекал бы данные в пакетном процессе каждую ночь (или с любой другой частотой).

Из вашего OP не ясно, если вам нужно«новые» данные после обновления или «старые» данные до обновления.Если вам нужны только самые последние данные, почему бы просто не добавить поле updated_date (тип даты или метки времени) и обновить его с помощью триггера.

create table test
(
id number,
val varchar2(100),
modified_date date  default sysdate not null
)
;

CREATE OR REPLACE TRIGGER TR_TEST_BU
BEFORE UPDATE
ON TEST REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
begin
  :new.modified_date := sysdate;
end;

insert into test(id, val) values (1, 'Insert 1');
commit;

select * from test;

exec dbms_lock.sleep(5);
update test set val = 'Update 1' where id = 1;
commit;

select * from test;

Если вам нужны старые данные перед обновлением (или вам все равнооб удаленных данных), затем вы измените триггер, чтобы записать старые или удаленные значения в таблицу истории, а затем извлекать данные оттуда.

Также обратите внимание, что добавление триггера в таблицу замедлит связанный DMLдеятельность.Некоторые магазины хотят избежать этого, заменив триггеры правилами бизнес-логики (указание «все приложения должны обновлять modifed_date»), что обычно приводит к противоречивым данным (или хуже) из того, что я видел.

1 голос
/ 10 января 2012

Да, здесь у вас есть пример update части.

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

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