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: 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

In response to

Responses

Browse pgsql-es-ayuda by date

  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