2012-01-10 6 views
5

Quiero colocar un desencadenador en una tabla que escribe todos los datos insertados/actualizados en un archivo de registro adicional para su procesamiento con una herramienta externa.Oracle Trigger para escribir todas las inserciones/actualizaciones en el archivo

¿Es la forma de lograr eso?

+1

Es posible que desee utilizar un desencadenante de actualización antes de insertar en una TABLA de registro, y luego extraerlo para procesarlo por lotes (cada noche, lo que sea). Asegúrese de agregar un campo de fecha "fecha de acción" (o marca de tiempo) que luego puede usar para extraer selectivamente los datos en función de cuándo se produjo el ingreso o la subida. – tbone

+0

gracias tbone, esta sería una buena solución. Pero sin cambiar la aplicación, creo que necesito poner un activador de actualización en la tabla y agregar una "última columna de actualización/cambio" adicional para seleccionar tarde en esa columna. ¿O tiene Oracle una función de construcción para esto? – user85155

Respuesta

5

Necesita crear desencadenantes que se ejecuten después de que la fila de la tabla se haya alterado y escribir en un archivo de registro utilizando el paquete UTL_FILE.

La información del paquete UTL_FILE se puede encontrar aquí: http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/u_file.htm

Y la documentación del disparador se puede encontrar aquí: http://docs.oracle.com/cd/B10501_01/appdev.920/a96590/adg13trg.htm

Hay una respuesta similar a lo que está buscando aquí: http://bytes.com/topic/oracle/answers/762007-trigger-output-text-file

Más información sobre cómo escribir en un archivo usando PL/SQL aquí: http://www.devshed.com/c/a/Oracle/Writing-to-Text-Files-in-Oracle-PLSQL/

Espero que ayude ...

+1

Como @tbone comentó, es posible que desee considerar un desencadenante ANTES ya que son más eficientes que los desencadenadores DESPUÉS - De los documentos de Oracle: ANTES los activadores de filas son ligeramente más eficientes que los desencadenadores DESPUÉS de la fila. Con los desencadenadores DESPUÉS de la fila, los bloques de datos afectados deben leerse (lectura lógica, no lectura física) una vez para el desencadenante y luego nuevamente para la declaración desencadenante. Alternativamente, con BEFORE row triggers, los bloques de datos deben leerse solo una vez para la declaración de activación y el disparador. – Ollie

1

Sí, here tiene un ejemplo de la pieza update.

Simplemente necesita hacer una similar a la parte insert.

2

Evitaría escribir en el sistema de archivos en tiempo DML, pero extraería los datos en un proceso por lotes cada noche (o la frecuencia).

Desde su OP, no está claro si necesita los datos "nuevos" después de la actualización, o los datos "anteriores" antes de la actualización. Si solo quiere los últimos datos, ¿por qué no simplemente agrega un campo de fecha modificada (fecha o tipo de marca de tiempo) y lo actualiza a través de un desencadenador?

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; 

Si necesita los datos antiguos antes de la actualización (o usted se preocupa por los datos eliminados), entonces se modificará el gatillo para escribir los valores antiguos o eliminados a una tabla de historial, a continuación, extraer los datos desde allí.

También tenga en cuenta que agregar un desencadenador a una tabla ralentizará la actividad DML asociada. Algunas tiendas desean evitar esto reemplazando los factores desencadenantes por reglas de lógica de negocios ("todas las aplicaciones deben actualizar edicion modifed_date"), lo que generalmente conduce a datos inconsistentes (o peores) de lo que he visto.

Cuestiones relacionadas