Ver Mensaje Individual
  #14  
Antiguo 15-04-2010
Avatar de Cañones
Cañones Cañones is offline
Miembro
 
Registrado: ene 2007
Ubicación: La Paz Entre Ríos
Posts: 354
Reputación: 18
Cañones Va por buen camino
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);
/* INSERT insercion - UPDATE actualizacion - DELETE eliminacion - DOWN baja logica - UP alta logica */
BEGIN 
  /* VEO QUE ACCION SE LLEVA A CABO */
  IF (INSERTING) THEN
    /* HAGO UN INSERT EN ARTICULOS_AUDITORIA CON LOS DATOS DEL ARTICULO */
    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
    /* HAGO UN INSERT EN ARTICULOS_AUDITORIA CON LOS DATOS DEL ARTICULO */
    BEGIN
    IF (NEW.FECHA_BAJA IS NOT NULL) THEN
      vACCION='DOWN'; /* SE PRODUCE UNA BAJA LOGICA */
    ELSE
      IF ((OLD.FECHA_BAJA IS NOT NULL) AND (NEW.FECHA_BAJA IS NULL)) THEN
        vACCION='UP';
      ELSE
        vACCION='UPDATE'; /* UNA ACTUALIZACION */
    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
    /* HAGO UN INSERT EN ARTICULOS_AUDITORIA CON LOS DATOS DEL ARTICULO */
    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.

Última edición por Cañones fecha: 15-04-2010 a las 20:33:56. Razón: PD
Responder Con Cita