Sunteți pe pagina 1din 6

Orlin Faustino Ortez Canales

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:

Cdigo:

create table log_facturas (
usuario varchar2(40),
fecha date,
tipo varchar2(14),
usuario_so varchar2(40),
nombre_pc varchar2(40),
codigo_n number,
codigocliente_n number,
importe_n number,
fecha_n date,
codigo_o number,
codigocliente_o number,
importe_o number,
fecha_o date);











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;

insert into log_facturas
(usuario, fecha, tipo, usuario_so, nombre_pc,
codigo_n, codigocliente_n, importe_n, fecha_n)
values (usuario_oracle, sysdate, 'ALTA',
usuario_so, nombre_pc,
:NEW.CODIGO, :NEW.CODIGOCLIENTE,
:NEW.IMPORTE, :NEW.FECHA);
end;

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;

insert into log_facturas
(usuario, fecha, tipo, usuario_so, nombre_pc,
codigo_o, codigocliente_o, importe_o, fecha_o)
values (usuario_oracle, sysdate, 'BAJA',
usuario_so, nombre_pc,
:OLD.CODIGO, :OLD.CODIGOCLIENTE,
:OLD.IMPORTE, :OLD.FECHA);
end;


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.

S-ar putea să vă placă și