PDA

Ver la Versión Completa : ¿logear registrar Actividad en aplicacion con firebird?


JXJ
03-11-2011, 22:11:16
hola

tengo una duda.
quiero poder logear todo lo que se quiera hacer en la base de datos.
ejemplo

mi aplicacion pide un usuario para entrar en la aplicacion
y quiero llevar un registo de que se hizo y quien y la fecha y hora.

osea se logeo el usuario
cuando se seleccione un producto y se venda quien vendio. a quien vendio.
a que hora se hizo la factura. que factura se hizo.
cuando se pago a los proveedores o cuadno se hizo el pedido.

hasta ahora he pensado en hacer una tabla llamada logs
para meter ahi la

no se si mi idea esta bine planteada lo de tener una tabla con todos los historicos de las acciones
importantes realizas y por quien y a que hora. o si.

no es buena idea.

asi como el mecanismo de usar una tabla en la base de datos.

¿acso hay otras formas de llevar un registro de eventos o se sucesos?
¡firebrid ya tiene algo inegrado de forma semejante que lleve un log de que se hizo. se agrego un registro. se borro.
se actualizo?


gracias por su ayuda

newtron
04-11-2011, 09:45:46
Hola.

A no ser que alguien más avezado me corrija creo que la mejor solución es usar los triggers de la base de datos para que en cada inserción/modificación/anulación de registros agregue en alguna tabla la información que necesites y a esto añadir manualmente lo relacionado con el logon de usuarios que al no afectar a ninguna tabla no disparará ningún trigger.

Saludos

Neftali [Germán.Estévez]
04-11-2011, 10:42:10
Yo creo que no vas mal encaminado.
Te recomiendo también que busques en los foros, porque es un tema que hemos discutido otras veces.

En mi caso utilizo una tabla de "traza" (yo la llamo así).
La idea es insertando información que las cosas que desees "guardar" en esta tabla. En mi caso información del usuario, junto con fecha y hora de la modificación, tablas que se modifica, ID del objeto modificado (estas dos para poder acceder al objeto), tipo de operación (INSERT, DELETE, UPDATE), y un par de campos que guardan el estado anterior y en nuevo del registro.

Lo más eficiente es rellenar esa información desde TRIGGERS como te han dicho, aunque tendrás que programar más, si lo haces desde programa es menos eficiente, pero debes programar menos.

JXJ
05-11-2011, 18:41:27
¿eso de triggers nunca lo he hecho para agregar campos. ?

no tienen un codigo de como seria

¿como genero el trigger y como le asigno que haga la insersion de la accion y que datos insgrese segun el usuario?
yo supongo que seria un usuario de la base de datos. diferente a sysdba
o seria posible tambien usar un usuario que yo de de alta en una tabla de usuarios

estoy confundido en esto.

gracis

ecfisa
05-11-2011, 21:25:17
Hola JXJ.

Te pongo un ejemplo muy simple, como para darte una idea, de triggers que guardan en la tabla USERLOG, las acciónes de borrado y modificación echas a la tabla TABLA:

SET TERM;^

CREATE TRIGGER TABLA_AD FOR TABLA
ACTIVE AFTER DELETE POSITION 0
AS
BEGIN
INSERT INTO USERLOG (USUARIO, ACCION, FECHAHORA)
VALUES((SELECT CURRENT_USER FROM RDB$DATABASE), 'BORRADO', (SELECT CURRENT_TIMESTAMP FROM RDB$DATABASE));
END^

CREATE TRIGGER TABLA_AU FOR TABLA
ACTIVE AFTER UPDATE POSITION 0
AS
BEGIN
INSERT INTO USERLOG (USUARIO, ACCION, FECHAHORA)
VALUES((SELECT CURRENT_USER FROM RDB$DATABASE), 'MODIFICACION', (SELECT CURRENT_TIMESTAMP FROM RDB$DATABASE));
END^

...

SET TERM;^


Un saludo.

JXJ
06-11-2011, 19:06:21
ya veo.
este escript es usando un usuario que esta dado de alta enl a base de datos de firebird.

yo acostumbro crear usuarios que solo estan registrados en una tabla.

y los mando a llamar.

se podria pasar el usuario de mi tabla en lugar de CURRENT_USER FROM RDB$DATABASE
????

revisando por que como tengo que hacer una aplicacion que tenga varias bases de datos
distribuidas en sucursales. y quieren que sean
replicadas la informacion de una en las otras y de las otras a la una.

no se me hace practivo tener dar de alta usuarios a labase de datos. y
hacer las acutlaizacioens a nivel interno. no se. a lo mejor estoy mal.

newtron
07-11-2011, 09:13:57
Yo lo que hago es almacenar el usuario en una variable, cuando se hace el log del usuario la capturo y la mantengo durante toda la aplicación y así lo tienes disponible para estas u otras cosas.

guillotmarc
07-11-2011, 10:53:58
ya veo.
este escript es usando un usuario que esta dado de alta enl a base de datos de firebird.

yo acostumbro crear usuarios que solo estan registrados en una tabla.

y los mando a llamar.

se podria pasar el usuario de mi tabla en lugar de CURRENT_USER FROM RDB$DATABASE
????

revisando por que como tengo que hacer una aplicacion que tenga varias bases de datos
distribuidas en sucursales. y quieren que sean
replicadas la informacion de una en las otras y de las otras a la una.

no se me hace practivo tener dar de alta usuarios a labase de datos. y
hacer las acutlaizacioens a nivel interno. no se. a lo mejor estoy mal.

Para identificar al usuario que lanza una consulta, puedes jugar con la función rdb$get_context('SYSTEM', 'CLIENT_ADDRESS')

Esta función te devuelve la dirección IP del usuario.

Ahora ya lo único que necesitas es poder identificar a cada usuario a partir de su dirección IP.

Para ello te recomiendo que añadas una nueva tabla de registro, que registre todas las conexiones de usuarios, anotando el usuario que se conecta, la hora y la dirección IP. Puedes utilizar los eventos de base de datos para rellenar automáticamente ese registro.

Ahora cuando quieras consultar cual es el usuario que ha lanzado una consulta, solo tienes que mirar la IP por la que se ha lanzado la consulta (mediante la función que hemos indicado al principio) y consultar el registro de conexiones de usuarios, para ver cual es el último usuario que ha entrado en el sistema por esa dirección IP.

NOTA: El problema lo tendremos si en un mismo equipo (en una misma dirección IP) se abren varias sesiones del programa, con usuarios distintos. Puesto que todas las consultas lanzadas desde ese equipo se asignarían al último de los usuarios que se haya validado desde allí. En ese caso, utiliza : rdb$get_context('SYSTEM', 'SESSION_ID')

Saludos.

rastafarey
23-11-2011, 03:39:18
Y donde guardas la informacion del usuario o los usuarios que estan logeados?. Me refiero a los que tienen en tu tabla.

fjcg02
23-11-2011, 07:27:03
Revisa este hilo...

http://clubdelphi.com/foros/showthread.php?t=66738&highlight=trigger+auditoria

Es interesante, desde el principio hasta el final. Yo me quedé con la última opción, de la que dispones el código.


Saludos