Asunto: Trigger o disparador que guarde modificaciones de registros
¿cómo 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:
Código:
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 histórico 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 histórico de modificaciones en otra tabla, podría desarrollar un "deshacer".
Utilizo Oracle 11g como motor de base de datos. Quisiera hacerlo por trigger (disparadores), pues por código en la aplicación creo que no sería viable.
Publicado:
Mar Ago 25, 2009 6:30 am
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2687
Asunto: Re: Trigger o disparador que guarde modificaciones de regist
Anuncios
varios escribió:
¿cómo 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:
Código:
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 histórico 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 histórico de modificaciones en otra tabla, podría desarrollar un "deshacer".
Utilizo Oracle 11g como motor de base de datos. Quisiera hacerlo por trigger (disparadores), pues por código en la aplicación creo que no sería viable.
Esta es una posibilidad:
1. Crear una tabla donde se guardarán todos los cambios que se vayan realizando, para tu caso podría ser algo así:
2. Crear un trigger (disparador) para las inserciones (nuevos registros), sería algo así:
Código:
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;
3. Crear un trigger (disparador) de Oracle para las modificaciones, sería algo así:
Código:
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;
4. Crear un trigger (disparador) de Oracle para las eliminaciones, sería algo así:
Código:
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;
Con esto se irán guardando en la tabla LOG_FACTURAS, todos los movimientos que se vayan realizando en la tabla FACTURAS, además, el trigger guarda el nombre del equipo (hostname) cliente, el usuario del sistema operativo y el usuario de Oracle con el que ha iniciado sesión.
En la tabla de log (log_facturas) se guardará un registro por cada inserción, actualización o eliminación que se haga en la tabla facturas. De forma que cuando sea una inserción (nuevo registro) guardará los valores introducidos, cuando sea una modificación guardará los valores anteriores y los valores nuevos (modificados), cuando sea una eliminación, 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.
Puede publicar nuevos temas en este foro No puede responder a temas en este foro No puede editar sus mensajes en este foro No puede borrar sus mensajes en este foro No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A