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

Peripheral Links

Header And Logo

PostgreSQL
| The world's most advanced open source database.

Site Navigation

Search for
  Advanced Search

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

Privacy Policy | PostgreSQL Archives hosted by Command Prompt, Inc. | Designed by tinysofa
Copyright © 1996 – 2008 PostgreSQL Global Development Group