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: | 2008-04-30 22:35:41 |
Message-ID: | 33e030de0804301535m24063323i4b6b3628dc4f652e@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
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
From | Date | Subject | |
---|---|---|---|
Next Message | Juan Manuel Fernandez | 2008-04-30 22:42:01 | Re: Manejar tablas de Log |
Previous Message | Alvaro Herrera | 2008-04-30 22:06:30 | Re: Consumo de memoria |