• Crear tabla de log para una tabla de SQL

    Supongamos que queremos registrar todos los cambios que se realizan en la tabla devoluciones y que esa tabla tiene 3 campos.

    Lo primero que tenemos que hacer es crear la tabla correspondiente para el log. Para ello ejecutamos:

    create table log_devoluciones as select * from devoluciones where 1=2;

    La parte de where 1=2 es para que copie la tabla con todos sus campos, pero sin los registros de esa tabla.

    Lo siguiente que vamos a hacer agregar dos campos a esa tabla, que serán los campos donde registraremos la fecha en la que se realizan las modificaciones que queremos loguear.

    alter table log_devoluciones add (
      FechaInicio timestamp with time zone not null,
      FechaFin    timestamp with time zone not null
    );

    Listo, ya tenemos la tabla de log creada. Ahora vamos a crear el disparador para que cada cambio que se ejecute en la tabla, se registre en la tabla de log:

    create or replace trigger tTablaDevolucion
    after insert or update or delete on devolucion
    for each row
    
    declare
      vAhora TIMESTAMP;
    
    begin
      select current_timestamp into vAhora from Dual;
    
      update log_devolucion
        set FechaFin = vAhora
        where FechaFin is null
        and CampoPrimaryKey = :old.CampoPrimaryKey
      ;
    
      if :new.CampoPrimaryKey is not null then
        insert into log_devolucion (Campo1, Campo2, Campo3, FechaInicio, FechaFin) values
          (:new.Campo1, :new.Campo2, :new.Campo3, vAhora, null)
        ;
    
      end if;
    
    end;

    .