La funcion de auditoria de la base de datos (audit) es normalmente manejada por el DBA. Oracle permite activar el audit en forma general lo cual aunque beneficioso genera mucho trabajo extra en la base de datos. La alternativa mas flexible es usar los trigers transaccionales para auditar los cambios. Las siguientes directrices deben ser seguidas: 1) La tabla de auditoria debe llamarse AUD_xxx donde xxx es el nombre de la tabla a auditar. 2) La tabla AUD_xxx debe contener las siguientes columnas AudFecha date PK, AudTrans char(1) PK, --(I)nsert (U)update (D)elete xxx.key xxx.tipo PK, --La llave de xxx (campos con sus nombres y --tipos originales) xxx.trace xxx.tipo, --Columnas de xxx adicionales a las que se les --quiera auditar (nombres y tipos originales) AudUsuario varchar2(30) 3) En caso de actualizacion de deben guardar los valores nuevos! 4) El trigger de auditoria debe seguir el siguiente machote: CREATE OR REPLACE TRIGGER AUD_xxx AFTER INSERT OR DELETE OR UPDATE OF xxx.key, xxx.trace ON xxx FOR EACH ROW Declare procedure CreaPista(Vtrans in char) is begin if vtrans='D' then insert into aud_xxx (audfecha, audtrans, audusuario, xxx.key, xxx.trace) values (sysdate, 'D', User, :old.xxx.key, :old.xxx.trace); else insert into aud_xxx (audfecha, audtrans, audusuario, xxx.key, xxx.trace) values (sysdate, vtrans, User, :new.xxx.key, :new.xxx.trace); end if; end; BEGIN If Inserting Then CreaPista('I'); elsif Updating then CreaPista('U'); elsif Deleting then CreaPista('D'); end if; END; / 5) Para auditar la tabla de pedidos rastreando los campos clase, tipo, linea, fecha, vencimiento, agenteventa, cliente, autorizacion, nombre y estado debemos hacerlo asi: 5.1) La tabla de auditoria drop table aud_venpedido; create table aud_venpedido (audfecha date not null, audtrans char(1) not null constraint aud_venpedido_trans_ck check (audtrans in ('I','U','D')), audusuario varchar2(30) not null, cia char(3) not null, -- Llave de venpedido sucursal char(3) not null, documento number(10) not null, clase char(1) not null, -- Otros datos a auditar tipo char(3) not null, linea char(3), fecha date not null, vencimiento date, agenteventa varchar2(3) not null, cliente varchar2(25) not null, autorizacion number(10), nombre varchar2(50) not null, estado char(1) not null, constraint aud_venpedido_pk primary key(audfecha, audtrans, cia, sucursal, documento) ); 5.2) Los indices Create index aud_venpedido_pedido_idx on aud_venpedido(documento, sucursal, cia); 5.3) El trigger El trigger se puede crear como after o before. Preferiblemente se debe crear como after exepto que haya colision con otro trigger en la tabla a auditar en cuyo caso se creara before. Si aun asi hay colision se deben fundir los triggers para que en uno solo hagan ambas labores. CREATE OR REPLACE TRIGGER AUD_VENPEDIDO AFTER INSERT OR DELETE OR UPDATE OF cia, sucursal, documento, clase, linea, fecha, vencimiento, agenteventa, cliente, autorizacion, nombre, estado ON VenPedido FOR EACH ROW Declare procedure CreaPista(Vtrans in char) is begin if vtrans='D' then insert into aud_venpedido (audfecha, audtrans, audusuario, cia, sucursal, documento, clase, tipo,linea, fecha, vencimiento, agenteventa, cliente, autorizacion, nombre, estado) values (sysdate, 'D', User, :old.cia, :old.sucursal, :old.documento, :old.clase, :old.tipo, :old.linea, :old.fecha, :old.vencimiento, :old.agenteventa, :old.cliente, :old.autorizacion, :old.nombre, :old.estado); else insert into aud_venpedido (audfecha, audtrans, audusuario, cia, sucursal, documento, clase, tipo,linea, fecha, vencimiento, agenteventa, cliente, autorizacion, nombre, estado) values (sysdate, vtrans, User, :new.cia, :new.sucursal, :new.documento, :new.clase, :new.tipo, :new.linea, :new.fecha, :new.vencimiento, :new.agenteventa, :new.cliente, :new.autorizacion, :new.nombre, :new.estado); end if; end; BEGIN If Inserting Then CreaPista('I'); elsif Updating then CreaPista('U'); elsif Deleting then CreaPista('D'); end if; END; /