Я бы избегал записи в файловую систему во время 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»), что обычно приводит к противоречивым данным (или хуже) из того, что я видел.