Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

 
 
Herramientas Buscar en Tema Desplegado
  #11  
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
Poder: 20
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
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Sistema de Huellas (Pistas de auditoria) Hagen Firebird e Interbase 3 29-03-2011 13:47:12
Trigger dinámico para Auditoría de Tablas jwmoreira Firebird e Interbase 6 11-03-2010 22:53:07
Realizar auditoria de acciones de usuarios mantrax Seguridad 3 19-10-2007 05:42:33
Un trigger que dispara un procedimiento que dispara un trigger... sitrico Firebird e Interbase 5 04-06-2007 22:05:13
Triggers de auditoria en firebird 1.5 robertoe Firebird e Interbase 1 04-01-2007 04:18:11


La franja horaria es GMT +2. Ahora son las 04:17:45.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi