Re: Iterate OLD/NEW columns in a trigger? - Mailing list pgsql-general
| From | Richard Huxton |
|---|---|
| Subject | Re: Iterate OLD/NEW columns in a trigger? |
| Date | |
| Msg-id | 42562D81.2010908@archonet.com Whole thread Raw |
| In response to | Re: Iterate OLD/NEW columns in a trigger? ("Steve - DND" <postgres@digitalnothing.com>) |
| List | pgsql-general |
Steve - DND wrote:
>>>try pltcl, it's supposed to be pretty good at this.
>>>
>>
>>As is plperl and likely plpython, and maybe others.
>
>
> Does anyone have an example of this at work? I tried a few Google searches,
> but couldn't get any results showing iterating over the columns of a record.
Attached - example of tcl function that tracks changes to target tables.
--
Richard Huxton
Archonet Ltd
-- tcl_track_history(TABLE-NAME)
-- Set TABLE-NAME when creating the trigger. Will automatically record change
-- details in tables history/history_detail
--
CREATE OR REPLACE FUNCTION tcl_track_history() RETURNS trigger AS '
switch $TG_op {
DELETE {
if { [llength [array names OLD cid]] > 0 } {
set clival $OLD(cid)
} else {
set clival "NULL"
}
spi_exec "INSERT INTO history (cid,tbl,act) VALUES ($clival, \'$1\', \'D\')"
}
INSERT {
if { [llength [array names NEW cid]] > 0 } {
set clival $NEW(cid)
} else {
set clival "NULL"
}
spi_exec "INSERT INTO history (cid,tbl,act) VALUES ($clival, \'$1\', \'I\')"
}
UPDATE {
if { [llength [array names OLD cid]] > 0 } {
set clival $OLD(cid)
} else {
set clival "NULL"
}
set inserted_main_history_row false
foreach {col} $TG_relatts {
# First result seems to be an empty string when stepping through columns
if { $col > "" } {
# Check if OLD/NEW contain a value
if { [llength [array names OLD $col]] > 0 } {
set oldval $OLD($col)
} else {
set oldval "NULL"
}
if { [llength [array names NEW $col]] > 0 } {
set newval $NEW($col)
} else {
set newval "NULL"
}
if { $oldval != $newval } {
if { !$inserted_main_history_row } {
spi_exec "INSERT INTO history (cid,tbl,act) VALUES ($clival, \'$1\', \'U\')"
set inserted_main_history_row true
}
spi_exec "INSERT INTO history_detail (col,was) VALUES (\'$col\', \'[ quote $oldval ]\')"
}
}
}
}
}
return OK
' LANGUAGE pltcl;
CREATE TRIGGER history_trig AFTER INSERT OR UPDATE OR DELETE ON client FOR EACH ROW EXECUTE PROCEDURE
tcl_track_history('client');
pgsql-general by date: