Thread: triggers and plpgsql question
Hi I want to do a generic function that I can add to triggers to add every inserts, updates and deletes from many differents tables into a common format in another table. the idea is : create function do_it_all () returns opaque ' begin IF TG_OP = ''INSERT'' THEN cycle through all of NEW (not knowing what it contains) and do things with them ELSIFTG_OP = ''UPDATE'' THEN cycle through all of NEW (not knowing what it contains) and do things with them ELSIFTG_OP = ''DELETE'' THEN say that NEW.id_||TG_RELNAME has been deleted END IF; END; The thing I need, is to be able to know what does NEW contains, and I have not found out any mean to do so. If it's not possible to do so, I'll write a function per table, but for the beauty of all this, I would have liked to do it the way above. -- Mathieu Arnold
Mathieu, > The thing I need, is to be able to know what does NEW contains, and I have > not found out any mean to do so. If it's not possible to do so, I'll write > a function per table, but for the beauty of all this, I would have liked to > do it the way above. You can't do this in PL/pgSQL. See the online documentation on writing triggers in C; that is the only way to get what you want. -- -Josh BerkusAglio Database SolutionsSan Francisco
--On mardi 27 août 2002 15:38 -0700 Josh Berkus <josh@agliodbs.com> wrote: > > Mathieu, > >> The thing I need, is to be able to know what does NEW contains, and I >> have not found out any mean to do so. If it's not possible to do so, >> I'll write a function per table, but for the beauty of all this, I would >> have liked to do it the way above. > > You can't do this in PL/pgSQL. See the online documentation on writing > triggers in C; that is the only way to get what you want. So, if I want to avoid C, I'll have to write a function per table. I'll have a look at SPI (as I believe after a short readout of the doc, I'll need it). -- Mathieu Arnold
--On mercredi 28 août 2002 08:42 +0200 Mathieu Arnold <mat@mat.cc> wrote: > > > --On mardi 27 août 2002 15:38 -0700 Josh Berkus <josh@agliodbs.com> wrote: > >> >> Mathieu, >> >>> The thing I need, is to be able to know what does NEW contains, and I >>> have not found out any mean to do so. If it's not possible to do so, >>> I'll write a function per table, but for the beauty of all this, I would >>> have liked to do it the way above. >> >> You can't do this in PL/pgSQL. See the online documentation on writing >> triggers in C; that is the only way to get what you want. > > So, if I want to avoid C, I'll have to write a function per table. I'll > have a look at SPI (as I believe after a short readout of the doc, I'll > need it). After a few hours of work, here is what I did. What it does is to log everything that gets inserted, deleted or updated into a table. I post it here because I believe that someone else might be interested. -- Mathieu Arnold