Voglio mettere un trigger su un tavolo, che scrive tutte inserite/Dati aggiornati a un file di registro aggiuntivo per l'elaborazione di uno strumento esterno.Oracle trigger per scrivere tutte le Insert/Aggiornamenti su file
È il modo per farlo?
Voglio mettere un trigger su un tavolo, che scrive tutte inserite/Dati aggiornati a un file di registro aggiuntivo per l'elaborazione di uno strumento esterno.Oracle trigger per scrivere tutte le Insert/Aggiornamenti su file
È il modo per farlo?
È necessario creare trigger che eseguono dopo la riga della tabella è stata modificata e scrivere in un file di registro utilizzando il pacchetto UTL_FILE.
L'informazioni sul pacchetto UTL_FILE può essere trovato qui: http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/u_file.htm
e la documentazione di trigger può essere trovato qui: http://docs.oracle.com/cd/B10501_01/appdev.920/a96590/adg13trg.htm
c'è una risposta simile a quello che state cercando qui: http://bytes.com/topic/oracle/answers/762007-trigger-output-text-file
Ulteriori informazioni su come scrivere su un file usando PL/SQL qui: http://www.devshed.com/c/a/Oracle/Writing-to-Text-Files-in-Oracle-PLSQL/
Spero che sia d'aiuto ...
Come commentato da @tbone, potresti prendere in considerazione un trigger BEFORE poiché sono più efficienti dei trigger AFTER - Da oracle Docs: PRIMA i trigger di riga sono leggermente più efficienti dei trigger di riga AFTER. Con i trigger di riga AFTER, i blocchi di dati interessati devono essere letti (lettura logica, non lettura fisica) una volta per il trigger e quindi nuovamente per l'istruzione di attivazione. In alternativa, con i trigger di fila BEFORE, i blocchi di dati devono essere letti una sola volta sia per l'istruzione di trigger che per il trigger. – Ollie
Sì, here si ha un esempio della parte update
.
è sufficiente per fare uno simile alla parte insert
.
Eviterei di scrivere sul file system in tempo DML, ma estrarre i dati in un processo batch ogni notte (o qualsiasi frequenza).
Dal vostro OP, non il suo chiaro se avete bisogno di "nuovi" i dati dopo l'aggiornamento, oppure i dati "vecchi" prima dell'aggiornamento. Se desideri solo i dati più recenti, perché non aggiungere semplicemente un campo modified_date (data o timestamp type) e aggiornarlo tramite un trigger.
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;
Se avete bisogno i vecchi dati prima dell'aggiornamento (o vi preoccupate per i dati cancellati) Allora ti modificare il grilletto per scrivere i valori vecchi o eliminati a una tabella di storia, poi estrarre i dati da lì.
Si noti inoltre che l'aggiunta di un trigger a una tabella rallenta l'attività DML associata. Alcuni negozi desiderano evitarlo sostituendo i trigger con le regole della logica aziendale ("tutte le app devono aggiornare l'editto modifed_date"), che di solito porta a dati incoerenti (o peggio) da quello che ho visto.
si consiglia di utilizzare un prima aggiornamento inserto grilletto per una tabella di log, e poi estrarre fuori per l'elaborazione in un modo batch (ogni notte, a prescindere). Assicurati di aggiungere un campo data "action_date" (o data/ora) che potrai utilizzare in un secondo momento per estrarre in modo selettivo i dati in base a quando si è verificato l'ins/upd. – tbone
grazie, questa sarebbe una buona soluzione. Ma senza modificare l'applicazione, penso di aver bisogno di inserire un trigger di aggiornamento sul tavolo e aggiungere un "ultimo aggiornamento/modifica colonna" in più su una selezione in ritardo su quella colonna. Oppure hai creato una funzionalità per questo? – user85155