Estudiante 5 ao Universidad Tecnolgica de El Salvador
Cmo puedo hacer un trigger en Oracle que guarde los cambios que se han producido en los registros de una tabla? tengo una tabla MUY importante de la que quiero dejar constancia de los cambios que se hayan producido en los registros.
Por ejemplo, tengo esta tabla: create table facturas ( codigo number primary key, codigocliente number, importe number, fecha date default sysdate);
Y quiero que se guarde, supongo que en otra tabla, el histrico de las modificaciones que se van realizando, tanto los Update (modificaciones de registros existentes), los Insert (inserciones de nuevos registros) y los Delete (eliminaciones de registros). De esta forma, en caso necesario, teniendo el histrico de modificaciones en otra tabla, podra desarrollar un "deshacer".
Orlin Faustino Ortez Canales Estudiante 5 ao Universidad Tecnolgica de El Salvador
1. Crear una tabla donde se guardarn todos los cambios que se vayan realizando, para tu caso podra ser algo as:
Orlin Faustino Ortez Canales Estudiante 5 ao Universidad Tecnolgica de El Salvador
Crear un trigger (disparador) para las inserciones (nuevos registros), sera algo as:
Cdigo:
CREATE OR REPLACE TRIGGER "SYSTEM".T_A_FACTURAS AFTER INSERT ON "SYSTEM"."FACTURAS" REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW declare usuario_oracle varchar2(40); nombre_pc varchar2(40); usuario_so varchar2(40); sesion_id number; begin select sys_context('USERENV','TERMINAL'), sys_context('USERENV','SESSIONID'), sys_context('USERENV', 'OS_USER'), sys_context('USERENV','CURRENT_USER') into nombre_pc, sesion_id, usuario_so, usuario_oracle from dual;
Orlin Faustino Ortez Canales Estudiante 5 ao Universidad Tecnolgica de El Salvador
Crear un trigger (disparador) de Oracle para las modificaciones, sera algo as: Cdigo: CREATE OR REPLACE TRIGGER T_M_FACTURAS BEFORE UPDATE ON "FACTURAS" REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW declare usuario_oracle varchar2(40); nombre_pc varchar2(40); usuario_so varchar2(40); sesion_id number; begin select sys_context('USERENV','TERMINAL'), sys_context('USERENV','SESSIONID'), sys_context('USERENV', 'OS_USER'), sys_context('USERENV','CURRENT_USER') into nombre_pc, sesion_id, usuario_so, usuario_oracle from dual; insert into log_facturas (usuario, fecha, tipo, usuario_so, nombre_pc, codigo_n, codigocliente_n, importe_n, fecha_n, codigo_o, codigocliente_o, importe_o, fecha_o) values (usuario_oracle, sysdate, 'ALTA', usuario_so, nombre_pc, :NEW.CODIGO, :NEW.CODIGOCLIENTE, :NEW.IMPORTE, :NEW.FECHA, :OLD.CODIGO, :OLD.CODIGOCLIENTE, :OLD.IMPORTE, :OLD.FECHA); end;
Orlin Faustino Ortez Canales Estudiante 5 ao Universidad Tecnolgica de El Salvador
4. Crear un trigger (disparador) de Oracle para las eliminaciones, sera algo as: Cdigo:
CREATE OR REPLACE TRIGGER T_E_FACTURAS AFTER DELETE ON FACTURAS REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW declare usuario_oracle varchar2(40); nombre_pc varchar2(40); usuario_so varchar2(40); sesion_id number; begin select sys_context('USERENV','TERMINAL'), sys_context('USERENV','SESSIONID'), sys_context('USERENV', 'OS_USER'), sys_context('USERENV','CURRENT_USER') into nombre_pc, sesion_id, usuario_so, usuario_oracle from dual;
Orlin Faustino Ortez Canales Estudiante 5 ao Universidad Tecnolgica de El Salvador
Con esto se irn guardando en la tabla LOG_FACTURAS, todos los movimientos que se vayan realizando en la tabla FACTURAS, adems, el trigger guarda el nombre del equipo (hostname) cliente, el usuario del sistema operativo y el usuario de Oracle con el que ha iniciado sesin.
En la tabla de log (log_facturas) se guardar un registro por cada insercin, actualizacin o eliminacin que se haga en la tabla facturas. De forma que cuando sea una insercin (nuevo registro) guardar los valores introducidos, cuando sea una modificacin guardar los valores anteriores y los valores nuevos (modificados), cuando sea una eliminacin, antes de eliminar el registro, guardar los valores de ste.
Con estos datos siempre ser posible realizar un "deshacer" de los cambios hechos por el usuario, sea un update, insert o delete.