Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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

pgsql-es-ayuda by date

Next:From: Juan Manuel FernandezDate: 2008-04-30 22:42:01
Subject: Re: Manejar tablas de Log
Previous:From: Alvaro HerreraDate: 2008-04-30 22:06:30
Subject: Re: Consumo de memoria

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group