Utilizamos cookies propias y de terceros. Al navegar entendemos que aceptas el uso de cookies. +Info.
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Usuario
· Wiki

Proyecto AjpdSoft: Foros

AjpdSoft :: Ver tema - Trigger o disparador que guarde modificaciones de registros
Foros de discusión Buscar Perfil FAQ Iniciar sesión
Information Trigger o disparador que guarde modificaciones de registros

Publicar nuevo tema Responder al tema
Foros de discusión » Oracle Database, motor de base de datos profesional   
Ver tema anterior :: Ver tema siguiente
AutorMensaje
varios
Magnífico usuario


Registrado: Oct 10, 2006
Mensajes: 2092

Asunto: Trigger o disparador que guarde modificaciones de registros Responder citando

¿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.
MensajePublicado:
Mar Ago 25, 2009 6:30 am
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Trigger o disparador que guarde modificaciones de regist Responder citando



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í:

Código:

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);


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;

  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;


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;

  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;


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;

  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;


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.
MensajePublicado:
Mar Ago 25, 2009 11:02 am
Top of PageVer perfil de usuario
Mostrar mensajes de anteriores:   
Todas las horas son GMT - 1 Horas
Publicar nuevo tema Responder al tema
Foros de discusión » Oracle Database, motor de base de datos profesional  

Cambiar a:  
Key
  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
Este sitio web NO CONTIENE malware, todos los programas con código fuente aquí. Autor: Alonso Javier Pérez Díaz Google+ Síguenos en Google+