Por ejemplo tengo esta tabla de Artículos
Código SQL
[-]CREATE TABLE ARTICULOS
(
IDARTICULO Integer NOT NULL, // ID DE TABLA, USO UN GENERADOR
CODIGO_INTERNO Varchar(20) NOT NULL,
CODIGO_EXTERNO Varchar(20) NOT NULL,
DESCRIPCION Varchar(80) NOT NULL,
COMPATIBILIDAD Varchar(200) NOT NULL,
IDLINEA Integer NOT NULL,
IDRUBRO Integer NOT NULL,
IDTITULO Integer NOT NULL,
IDPROVEEDOR Integer NOT NULL,
PRECIO_LISTA Numeric(18,4) NOT NULL,
DESCUENTO Numeric(18,4) NOT NULL,
IVA Numeric(18,4) NOT NULL,
BENEFICIO_SOS Numeric(18,4) NOT NULL,
BENEFICIO_MOVIL Numeric(18,4) NOT NULL,
CONTROL_STOCK BINARIO DEFAULT 0 NOT NULL,
STOCK Integer NOT NULL,
PUNTO_REPOSICION Integer NOT NULL,
FECHA_COMPRA Date NOT NULL,
FECHA_ACTPRECIO Date NOT NULL,
FECHA_BAJA Date,
PRIMARY KEY (IDARTICULO)
);
Hago la tabla de auditoria
Código SQL
[-]CREATE TABLE ARTICULOS_AUDITORIA
(
IDTRANSACCION Integer NOT NULL,
IDARTICULO Integer NOT NULL,
CODIGO_INTERNO Varchar(20) NOT NULL,
CODIGO_EXTERNO Varchar(20) NOT NULL,
DESCRIPCION Varchar(80) NOT NULL,
COMPATIBILIDAD Varchar(200) NOT NULL,
IDLINEA Integer NOT NULL,
IDRUBRO Integer NOT NULL,
IDTITULO Integer NOT NULL,
IDPROVEEDOR Integer NOT NULL,
PRECIO_LISTA Numeric(18,4) NOT NULL,
DESCUENTO Numeric(18,4) NOT NULL,
IVA Numeric(18,4) NOT NULL,
BENEFICIO_SOS Numeric(18,4) NOT NULL,
BENEFICIO_MOVIL Numeric(18,4) NOT NULL,
CONTROL_STOCK BINARIO DEFAULT 0 NOT NULL,
STOCK Integer NOT NULL,
PUNTO_REPOSICION Integer NOT NULL,
FECHA_COMPRA Date NOT NULL,
FECHA_ACTPRECIO Date NOT NULL,
FECHA_BAJA Date,
FECHA_HORA Timestamp DEFAULT 'NOW' NOT NULL, // FECHA Y HORA DEL REGISTRO
USUARIO Char(31) NOT NULL, // USR DE LA BD
ACCION Varchar(20) NOT NULL, // ACCION QUE REALIZA
REMOTE_ADDRESS Varchar(253) NOT NULL, // DIRECCION DESDE DONDE ACCEDE
PRIMARY KEY (IDTRANSACCION)
);
El trigger, es un poco largo, pero funciona. Se puede mejorar pero no he tenido tiempo de hacerlo
Código SQL
[-]
SET TERM ^ ;
CREATE TRIGGER TG_AUDITORIA_ARTICULOS FOR ARTICULOS ACTIVE
BEFORE INSERT OR UPDATE OR DELETE POSITION 0
AS
DECLARE VARIABLE vACCION VARCHAR(6);
BEGIN
IF (INSERTING) THEN
BEGIN
vACCION='INSERT';
INSERT INTO ARTICULOS_AUDITORIA (IDTRANSACCION, IDARTICULO, CODIGO_INTERNO, CODIGO_EXTERNO, DESCRIPCION, COMPATIBILIDAD, IDLINEA, IDRUBRO, IDTITULO, IDPROVEEDOR, PRECIO_LISTA, DESCUENTO, IVA, BENEFICIO_SOS, BENEFICIO_MOVIL, CONTROL_STOCK, STOCK, PUNTO_REPOSICION, FECHA_COMPRA, FECHA_ACTPRECIO, FECHA_BAJA, FECHA_HORA, USUARIO, ACCION, REMOTE_ADDRESS)
VALUES (
GEN_ID(GEN_IDTRANSACCION_ART, 1),
NEW.IDARTICULO,
NEW.CODIGO_INTERNO,
NEW.CODIGO_EXTERNO,
NEW.DESCRIPCION,
NEW.COMPATIBILIDAD,
NEW.IDLINEA,
NEW.IDRUBRO,
NEW.IDTITULO,
NEW.IDPROVEEDOR,
NEW.PRECIO_LISTA,
NEW.DESCUENTO,
NEW.IVA,
NEW.BENEFICIO_SOS,
NEW.BENEFICIO_MOVIL,
NEW.CONTROL_STOCK,
NEW.STOCK,
NEW.PUNTO_REPOSICION,
NEW.FECHA_COMPRA,
NEW.FECHA_ACTPRECIO,
NEW.FECHA_BAJA,
'NOW',
(SELECT MON$USER
FROM MON$ATTACHMENTS
WHERE MON$ATTACHMENT_ID = CURRENT_CONNECTION),
:vACCION,
(SELECT MON$REMOTE_ADDRESS
FROM MON$ATTACHMENTS
WHERE MON$ATTACHMENT_ID = CURRENT_CONNECTION)
);
END
IF (UPDATING) THEN
BEGIN
IF (NEW.FECHA_BAJA IS NOT NULL) THEN
vACCION='DOWN';
ELSE
IF ((OLD.FECHA_BAJA IS NOT NULL) AND (NEW.FECHA_BAJA IS NULL)) THEN
vACCION='UP';
ELSE
vACCION='UPDATE';
INSERT INTO ARTICULOS_AUDITORIA (IDTRANSACCION, IDARTICULO, CODIGO_INTERNO, CODIGO_EXTERNO, DESCRIPCION, COMPATIBILIDAD, IDLINEA, IDRUBRO, IDTITULO, IDPROVEEDOR, PRECIO_LISTA, DESCUENTO, IVA, BENEFICIO_SOS, BENEFICIO_MOVIL, CONTROL_STOCK, STOCK, PUNTO_REPOSICION, FECHA_COMPRA, FECHA_ACTPRECIO, FECHA_BAJA, FECHA_HORA, USUARIO, ACCION, REMOTE_ADDRESS)
VALUES (
GEN_ID(GEN_IDTRANSACCION_ART, 1),
NEW.IDARTICULO,
NEW.CODIGO_INTERNO,
NEW.CODIGO_EXTERNO,
NEW.DESCRIPCION,
NEW.COMPATIBILIDAD,
NEW.IDLINEA,
NEW.IDRUBRO,
NEW.IDTITULO,
NEW.IDPROVEEDOR,
NEW.PRECIO_LISTA,
NEW.DESCUENTO,
NEW.IVA,
NEW.BENEFICIO_SOS,
NEW.BENEFICIO_MOVIL,
NEW.CONTROL_STOCK,
NEW.STOCK,
NEW.PUNTO_REPOSICION,
NEW.FECHA_COMPRA,
NEW.FECHA_ACTPRECIO,
NEW.FECHA_BAJA,
'NOW',
(SELECT MON$USER
FROM MON$ATTACHMENTS
WHERE MON$ATTACHMENT_ID = CURRENT_CONNECTION),
:vACCION,
(SELECT MON$REMOTE_ADDRESS
FROM MON$ATTACHMENTS
WHERE MON$ATTACHMENT_ID = CURRENT_CONNECTION)
);
END
IF (DELETING) THEN
BEGIN
vACCION='DELETE';
INSERT INTO ARTICULOS_AUDITORIA (IDTRANSACCION, IDARTICULO, CODIGO_INTERNO, CODIGO_EXTERNO, DESCRIPCION, COMPATIBILIDAD, IDLINEA, IDRUBRO, IDTITULO, IDPROVEEDOR, PRECIO_LISTA, DESCUENTO, IVA, BENEFICIO_SOS, BENEFICIO_MOVIL, CONTROL_STOCK, STOCK, PUNTO_REPOSICION, FECHA_COMPRA, FECHA_ACTPRECIO, FECHA_BAJA, FECHA_HORA, USUARIO, ACCION, REMOTE_ADDRESS)
VALUES (
GEN_ID(GEN_IDTRANSACCION_ART, 1),
OLD.IDARTICULO,
OLD.CODIGO_INTERNO,
OLD.CODIGO_EXTERNO,
OLD.DESCRIPCION,
OLD.COMPATIBILIDAD,
OLD.IDLINEA,
OLD.IDRUBRO,
OLD.IDTITULO,
OLD.IDPROVEEDOR,
OLD.PRECIO_LISTA,
OLD.DESCUENTO,
OLD.IVA,
OLD.BENEFICIO_SOS,
OLD.BENEFICIO_MOVIL,
OLD.CONTROL_STOCK,
OLD.STOCK,
OLD.PUNTO_REPOSICION,
OLD.FECHA_COMPRA,
OLD.FECHA_ACTPRECIO,
OLD.FECHA_BAJA,
'NOW',
(SELECT MON$USER
FROM MON$ATTACHMENTS
WHERE MON$ATTACHMENT_ID = CURRENT_CONNECTION),
:vACCION,
(SELECT MON$REMOTE_ADDRESS
FROM MON$ATTACHMENTS
WHERE MON$ATTACHMENT_ID = CURRENT_CONNECTION)
);
END
END^
SET TERM ; ^
UPDATE RDB$TRIGGERS set
RDB$DESCRIPTION = 'TG PARA AUDITAR LAS MODIFICACIONES EN LA TABLA DE ARTICULOS'
where RDB$TRIGGER_NAME = 'TG_AUDITORIA_ARTICULOS';
Eso es todo.
Espero les sirva.
Saludos de Cañones
PD: cualquier duda, preguntan nomas. No contesto de inmediato porque no me llegan las notificaciones.