2012-01-10 15 views
5

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?

+1

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

+0

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

risposta

5

È 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 ...

+1

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

1

Sì, here si ha un esempio della parte update.

è sufficiente per fare uno simile alla parte insert.

2

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.

Problemi correlati