Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Procedimiento Almacenado para Auditoria (https://www.clubdelphi.com/foros/showthread.php?t=83030)

elrodrix 04-05-2013 21:22:24

Procedimiento Almacenado para Auditoria
 
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

Código SQL [-]
-- --------------------------------------------------------------------------------
-- 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 no estoy en la seccion correspondiente, que me informen asi lo posteo donde corresponde. Saludos y Gracias

Al González 04-05-2013 22:26:15

El uso de disparadores no estaría mal, estoy seguro que MySQL ha de manejar alguna función o variable para determinar que usuario está ejecutando la operación (en Firebird es Current_User). ¿No será que utilizas el mismo usuario de MySQL para todos los que trabajan con la aplicación? :confused:

Una alternativa del lado de Delphi es redefinir unos cuantos métodos de los componentes de acceso a datos, para "interceptar" todos los Inserts, Updates y Delete). ¿Qué tipos de objetos usas para llevar a cabo estas operaciones?

Saludos.

elrodrix 05-05-2013 04:52:01

Gracias por responder. Utilizo componentes ADO para la conexion los SP. Como puedo definir datos desde delphi para interceptar los INSERT UPDATE Y DELETES?. Saludos

elrodrix 05-05-2013 04:56:51

Cita:

Empezado por Al González (Mensaje 459809)
El uso de disparadores no estaría mal, estoy seguro que MySQL ha de manejar alguna función o variable para determinar que usuario está ejecutando la operación (en Firebird es Current_User). ¿No será que utilizas el mismo usuario de MySQL para todos los que trabajan con la aplicación? :confused:

Una alternativa del lado de Delphi es redefinir unos cuantos métodos de los componentes de acceso a datos, para "interceptar" todos los Inserts, Updates y Delete). ¿Qué tipos de objetos usas para llevar a cabo estas operaciones?

Saludos.

Muchas gracias por contestar. O sea que la logica seria crear diferentes usuarios en MYSQL para cada una de las terminales que utilizan el programa?

Al González 05-05-2013 18:22:22

Cita:

Empezado por elrodrix (Mensaje 459816)
Utilizo componentes ADO para la conexión los SP. Como puedo definir datos desde delphi para interceptar los INSERT UPDATE Y DELETES?

Si usas ADO, creo que podrías intentar con los eventos OnWillExecute y OnExecuteComplete. En la ayuda de Delphi ambos vienen explicados, y con más detalle en la página de los autores de ADO:

http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Cita:

Empezado por elrodrix (Mensaje 459817)
[...] la lógica sería crear diferentes usuarios en MYSQL para cada una de las terminales que utilizan el programa?

Lo adecuado es que en el motor de la base de datos exista una clave de usuario por cada persona capaz de agregar, modificar o eliminar cualquier elemento de información (y que esas personas accedan a la aplicación con su particular clave y contraseña). Así cada usuario se responsabiliza de lo que hace. ^\||/

Saludos.

elrodrix 05-05-2013 20:17:21

Cita:

Empezado por Al González (Mensaje 459828)
Si usas ADO, creo que podrías intentar con los eventos OnWillExecute y OnExecuteComplete. En la ayuda de Delphi ambos vienen explicados, y con más detalle en la página de los autores de ADO:

http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx


Lo adecuado es que en el motor de la base de datos exista una clave de usuario por cada persona capaz de agregar, modificar o eliminar cualquier elemento de información (y que esas personas accedan a la aplicación con su particular clave y contraseña). Así cada usuario se responsabiliza de lo que hace. ^\||/

Saludos.


Muchas gracias por tu respuesta. La verdad nunca habia trabajado de esa manera. Tengo varios proyectos en PHP por ej. donde la conexion a la db es una sola, con un solo usuario y pass, y a partir de ese usuario se gestionan todas las acciones de los USUARIOS que se loguean en mi pagina.
Voy a intentar crear un proyecto de prueba de la forma que me planteas y probar. Saludos y gracias !

Al González 06-05-2013 05:53:10

Comprendo elrodrix. En Delphi es un poco diferente, pero con la ventaja de que todo es posible.

No fue nada, ya nos dirás lo que se te vaya presentando.

Saludos. :)


La franja horaria es GMT +2. Ahora son las 10:49:11.

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