Ir al contenido


Foto

Procedimiento Almacenado para Auditoria


  • Por favor identifícate para responder
3 respuestas en este tema

#1 elrodrix

elrodrix

    Member

  • Miembros
  • PipPip
  • 24 mensajes

Escrito 04 mayo 2013 - 12:26

Que tal? estoy intentando hacer una auditoria para mi aplicacion en delphi, usando como motor de db a MYSQL.

Resulta que estoy buscando la forma de programar un script de forma tal que capture cualquier evento en mi base de dato (INSERT, UPDATE, DELETE) y poder recuperar los datos a operar en una tabla de auditoria.

Hasta el momento llegue a la conclusion que no me sirve utilizar trigger, ya que necesito capturar el ID del usuario logueado el cual realiza la accion (INSERT, UPDATE, DELETE), y ese ID lo guardo en una variable publica en mi MAIN de la aplicacion en delphi, y hasta donde yo se, los triggers solo procesan datos con los que trabaja la tabla.

Entonces, ya que uso SP  para los inserts, probe realizar el siguiente script, y necesito la critica de los que verdaderamente saben (ustedes v:-)v ) y que me digan que opinan al respecto, si conviene trabajar asi, si es factible en cuanto a velocidad de proceso, etc.

Algo para tener en cuenta, mi aplicacion es para una oficina, en la cual son no mas de 12 terminales, 5 para consultas y no mas de 5 para ABM de datos, y 2 que administren.

A continuacion les dejo mi SP

-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `acta_alta`(
    in p_actanum int,
    in p_actaserie varchar(2),
    in p_actafecha Date,
    in p_actahora varchar (5),
    in p_offdni int,
    in p_empresaid int,
    in var1 int,
    in var2 int,
    in var3 int,
    in var4 int,
    in var5 int,
    in var6 int,
    in var7 int,
    in var8 int,
    in var9 int,
    in var10 int,
    in p_vehicledom varchar (45),
    in p_lugarid int,
    in p_actanumcalle varchar (45),
    in p_causanum int,
    in p_causafecha date,
    in p_usu int
   
)
BEGIN

/*Primer INSERT datos ACTA*/

    INSERT INTO acta (actanum, actaserie, actafecha, actahora, actanumcalle, offdni, empresa_id, vehicledom, lugar_id, causanum, causafecha)
    VALUES (p_actanum, p_actaserie, p_actafecha, p_actahora, p_actanumcalle, p_offdni, p_empresaid, p_vehicledom, p_lugarid, p_causanum, p_causafecha);

/*Segundo INSERT datos INFRACCION*/

    if var1 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var1);
    end if;
   
    if var2 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var2);
    end if;
   
    if var3 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var3);
    end if;
   
    if var4 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var4);
    end if;
   
    if var5 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var5);
    end if;
   
    if var6 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var6);
    end if;
   
    if var7 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var7);
    end if;
   
    if var8 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var8);
    end if;
   
    if var9 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var9);
    end if;
   
    if var10 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var10);
    end if;
   
/*Tercer INSERT de CAUSA en tabla CAUSA*/

    INSERT INTO causa (causanum, causafecha)
    VALUES (p_causanum, p_causafecha);
   
/*cuarto INSERT para AUDITORIA ACTA*/

    INSERT INTO audit_acta (tipoact, actanum_new, actaserie_new, actafecha_new, actahora_new, usu_id, fecha, hora)
    VALUES ('I', p_actanum, p_actaserie, p_actafecha, p_actahora, p_usu, CURRENT_DATE(), CURRENT_TIME());

END



La estructura de las tablas que uso son las siguientes

acta
*actanum
*actaserie
actafecha
actahora
actanumcalle
offdni
empresa_id
vehicledom
lugar_id
causanum
causafecha
resolnum
resolfecha
pago_id
fichanum


causa
*causanum
*causafecha
causaobs


actabreach
*actabreach_id (AI)
actanum
actaserie
breach_id


Agradeceria mucho su ayuda, y si este tema no corresponde en esta seccion, por favor hacerme saber asi lo cambio. Saludos y gracias
  • 0

#2 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 04 mayo 2013 - 03:01

Hasta el momento llegue a la conclusion que no me sirve utilizar trigger, ya que necesito capturar el ID del usuario logueado el cual realiza la accion (INSERT, UPDATE, DELETE), y ese ID lo guardo en una variable publica en mi MAIN de la aplicacion en delphi, y hasta donde yo se, los triggers solo procesan datos con los que trabaja la tabla.


Yo justo a cada tabla que necesito monitorear le agrego un campo ID_Usuario en el que almaceno el ID del usuario que realiza la última acción (Ese ID que guardas en una variable publica en el MAIN de tu aplicacion en delphi). De ese modo puedo hacerlo tranquilamente desde el trigger.

Saludos.
  • 0

#3 elrodrix

elrodrix

    Member

  • Miembros
  • PipPip
  • 24 mensajes

Escrito 04 mayo 2013 - 08:47


Hasta el momento llegue a la conclusion que no me sirve utilizar trigger, ya que necesito capturar el ID del usuario logueado el cual realiza la accion (INSERT, UPDATE, DELETE), y ese ID lo guardo en una variable publica en mi MAIN de la aplicacion en delphi, y hasta donde yo se, los triggers solo procesan datos con los que trabaja la tabla.


Yo justo a cada tabla que necesito monitorear le agrego un campo ID_Usuario en el que almaceno el ID del usuario que realiza la última acción (Ese ID que guardas en una variable publica en el MAIN de tu aplicacion en delphi). De ese modo puedo hacerlo tranquilamente desde el trigger.

Saludos.


Es muy buena tu opcion. Una pregunta, en el que caso de un DELETE, como hago para pasarle al trigger el ID del usuario que realiza la accion, ya que en la tabla a auditar esta el ID del usuario que realizo el INSERT o el UPDATE. Saludos y gracias
  • 0

#4 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 05 mayo 2013 - 08:59

Una pregunta, en el que caso de un DELETE, como hago para pasarle al trigger el ID del usuario que realiza la accion, ya que en la tabla a auditar esta el ID del usuario que realizo el INSERT o el UPDATE. Saludos y gracias


Simplemente insertas la novedad de borrado en la tabla de auditoría antes de que el registro sea borrado en la tabla a auditar, o sea el trigger  debe actuar en  BEFORE DELETE y el usuario sería OLD.IDUsuario.

Saludos.
  • 0