Re: Manejar tablas de Log
- From: "Marco Antonio Frias Butron" <marcoantoniofrias(at)gmail(dot)com>
- To: "Juan Manuel Fernandez" <jmfernandez(at)unlu(dot)edu(dot)ar>
- Cc: "Lista - PostgreSQL" <pgsql-es-ayuda(at)postgresql(dot)org>
- Subject: Re: Manejar tablas de Log
- Date: Wed, 30 Apr 2008 18:35:41 -0400
- Message-id: <33e030de0804301535m24063323i4b6b3628dc4f652e(at)mail(dot)gmail(dot)com>
On Wed, Apr 30, 2008 at 4:37 PM, Juan Manuel Fernandez
<jmfernandez(at)unlu(dot)edu(dot)ar> wrote:
> Buenas tardes Lista,
> acabo de terminar el modelo de la base
> de datos y quisiera implementar tablas de logs para llevar control de
> los cambios que sufre la BD por parte de los diferentes usuarios.
> Del SGBD del que vengo, se hacia manual, es decir creabas una tabla
> T_LOG y controlabas los cambios con triggers de before insert.
> Ahora mi pregunta es...
>
> Ofrece PostgreSQL alguna variante a esta cuestion?
Hola, a lo que veo tienes dos opciones:
1ra. Vos construyes tu propia estructura del log con tus campos que
necesites y ayudado de tiggers con before insert, update o before
delete. Un ejemplo:
CREATE TABLE personal (
idpersonal SERIAL PRIMARY KEY,
nombres TEXT NOT NULL,
apellido1 TEXT NOT NULL,
apellido2 TEXT
);
CREATE TABLE logpersonal (
idlogpersonal SERIAL PRIMARY KEY,
accion CHARACTER(1) NOT NULL,
fecha TIMESTAMP NOT NULL,
idpersonal INTEGER NOT NULL,
nombres TEXT NOT NULL,
apellido1 TEXT NOT NULL,
apellido2 TEXT
);
Donde la 'accion' almacena que tipo de cambio sufrió la tupla (I=insert,
U=update o D=delete) y la 'fecha' que es automática al registrarse y
el resto son los mismos que la tabla auditada.
CREATE OR REPLACE FUNCTION logpersonal() RETURNS TRIGGER AS $$
BEGIN
IF (TG_OP = 'INSERT') THEN
INSERT INTO logpersonal
SELECT nextval('logpersonal_idlogpersonal_seq'), 'I', now(), NEW.*;
RETURN NEW;
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO logpersonal
SELECT nextval('logpersonal_idlogpersonal_seq'), 'U', now(), NEW.*;
RETURN NEW;
ELSIF (TG_OP = 'DELETE') THEN
INSERT INTO logpersonal
SELECT nextval('logpersonal_idlogpersonal_seq'), 'D', now(), OLD.*;
RETURN OLD;
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER logpersonal_tg AFTER
INSERT OR UPDATE OR DELETE ON personal
FOR EACH ROW EXECUTE PROCEDURE logpersonal();
2da. opción utilizar el proyecto tablelog, lo encuentras en
http://pgfoundry.org/projects/tablelog/ , básicamente hace los mismo,
entre sus opciones tiene la de restaurar un dato borrado... algo
relativamente interesante!
3ra. Alvaro me sugirió esto:
Jeff Davis y Selena Deckelmann dieron una charla sobre esto en el
PostgreSQL Day en Portland hace un par de meses:
http://www.j-davis.com/postgresql/temporal/presentation.odp
Seguro que si les preguntas, te dicen donde tienen el codigo de sus
nuevos tipos de dato.
vale la pena esta buena esa solución. depende de vos cual utilizar!
--
Saludos y abrazos...
Marco Antonio Frias Butrón
Slackware Linux User
Linux Registered User #356229 - http://counter.li.org/
http://marcoantoniofrias.uni.cc
Home |
Main Index |
Thread Index