Re: Is this possible in a trigger?

From: Fernando <fernando(at)ggtours(dot)ca>
To: Klint Gore <kgore4(at)une(dot)edu(dot)au>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: Is this possible in a trigger?
Date: 2008-05-07 13:37:21
Message-ID: 4821B091.20608@ggtours.ca
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Thank you for your answer. I guess I better create this history in the
application's data class.

Klint Gore 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.
>

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Thomas Pundt 2008-05-07 13:48:21 Re: Import German Decimal Numbers
Previous Message Tino Wildenhain 2008-05-07 13:24:44 Re: Import German Decimal Numbers