This is easy with plpython.  We do something similar.

Kerri

On Tue, May 6, 2008 at 6:10 PM, Klint Gore <[EMAIL PROTECTED]> wrote:

> Fernando wrote:
>
> > I want to keep a history of changes on a field in a table.  This will be
> > the case in multiple tables.
> >
> > Can I create a trigger that loops the OLD and NEW values and compares
> > the values and if they are different creates a change string as follows:
> >
> > e.g;
> >
> > FOR EACH field IN NEW
> >    IF field.value <> OLD.field.name THEN
> >       changes := changes
> >            || field.name
> >            || ' was: '
> >            || OLD.field.value
> >            || ' now is: '
> >            || field.value
> >            || '\n\r';
> >    END IF
> > END FOR;
> >
> > Your help is really appreciated.
> >
> You can't in plpgsql.  It doesn't have the equivalent of a walkable fields
> collection.  Its possible in some other procedure languages (I've seen it
> done in C).
>
> Having said that, you might be able to create new and old temp tables and
> then use the system tables to walk the columns list executing sql to check
> for differences.
>
> something like
>
>  create temp table oldblah as select old.*;
>  create temp table newblah as select new.*;
>  for arecord in
>       select columnname
>       from pg_??columns??
>       join pg_??tables?? on ??columns??.xxx = ??tables??.yyy
>      where tablename = oldblah and pg_table_is_visible
>  loop
>
>       execute 'select old.' || arecord.columname || '::text , new. ' ||
> arecord.columname || '::text' ||
>                   ' from oldblah old, newblah new ' ||
>                   ' where oldblah.' || arecord.columnname || ' <>
> newblah.' ||arecord.columnname    into oldval,newval;
>
>      changes := changes || arecord.columnname || ' was ' || oldval || '
> now ' || newval;
>  end loop;
>  execute 'drop table oldblah';
>  execute 'drop table newblah';
>
> performance could be awful though.
>
> klint.
>
> --
> Klint Gore
> Database Manager
> Sheep CRC
> A.G.B.U.
> University of New England
> Armidale NSW 2350
>
> Ph: 02 6773 3789  Fax: 02 6773 3266
> EMail: [EMAIL PROTECTED]
>
>
> --
> Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-general
>



-- 
Yuma Educational Computer Consortium
Compass Development Team
Kerri Reno
[EMAIL PROTECTED] (928) 502-4240
.·:*¨¨*:·. .·:*¨¨*:·. .·:*¨¨*:·.

Reply via email to