Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-05-2013
elrodrix elrodrix is offline
Miembro
NULL
 
Registrado: nov 2011
Posts: 32
Poder: 0
elrodrix Va por buen camino
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 ) 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
Responder Con Cita
  #2  
Antiguo 04-05-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
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?

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.
Responder Con Cita
  #3  
Antiguo 05-05-2013
elrodrix elrodrix is offline
Miembro
NULL
 
Registrado: nov 2011
Posts: 32
Poder: 0
elrodrix Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 05-05-2013
elrodrix elrodrix is offline
Miembro
NULL
 
Registrado: nov 2011
Posts: 32
Poder: 0
elrodrix Va por buen camino
Cita:
Empezado por Al González Ver Mensaje
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?

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?
Responder Con Cita
  #5  
Antiguo 05-05-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por elrodrix Ver Mensaje
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 Ver Mensaje
[...] 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.
Responder Con Cita
  #6  
Antiguo 05-05-2013
elrodrix elrodrix is offline
Miembro
NULL
 
Registrado: nov 2011
Posts: 32
Poder: 0
elrodrix Va por buen camino
Cita:
Empezado por Al González Ver Mensaje
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 !
Responder Con Cita
  #7  
Antiguo 06-05-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
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.
Responder Con Cita
Respuesta



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
Trigger dinámico para Auditoría de Tablas jwmoreira Firebird e Interbase 6 11-03-2010 22:53:07
Procedimiento almacenado Ledian_Fdez SQL 0 03-03-2010 15:38:18
Consejo para principiante sobre Disparador y Procedimiento almacenado NPIdea Firebird e Interbase 5 18-06-2008 08:13:00
Procedimiento almacenado para obtener Rubros y subrubros oliverinf Firebird e Interbase 7 27-08-2004 01:25:42
Procedimiento almacenado - BDE Ricardo Alfredo Conexión con bases de datos 1 16-06-2003 21:31:34


La franja horaria es GMT +2. Ahora son las 09:25:25.


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
Copyright 1996-2007 Club Delphi