Re: create function and trigger to update column on table update

Поиск
Список
Период
Сортировка
От Josh Kupershmidt
Тема Re: create function and trigger to update column on table update
Дата
Msg-id AANLkTi=Bdnqnfpt8wgXxAph3bXv7r2Zfg6zmD4L7WUOp@mail.gmail.com
обсуждение исходный текст
Ответ на create function and trigger to update column on table update  ("Dara Olson" <dolson@glifwc.org>)
Список pgsql-novice
On Wed, Dec 15, 2010 at 5:02 PM, Dara Olson <dolson@glifwc.org> wrote:
> I am new to creating triggers/functions.  I am trying to create a trigger
> and function that when a specific table is updated or records added that it
> updates an existing column (catalog_number) from an existing column and
> latitude/longitude.  Below is what I have so far.  Does anyone know what I
> am doing wrong or if I am going in the complete wrong direction?  Is there a
> way to define that the column only gets updated on the records that were
> updated or inserted. Any help would be greatly appreciated!
> Thanks!
> Dara
>
> CREATE OR REPLACE FUNCTION invasive_species.update_catalog_number() RETURNS
> TRIGGER AS
> 'BEGIN
>
> IF TG_OP = "UPDATE" THEN
> UPDATE invasive_species.invspp_occurrence_data
> SET catalog_number = "tsn_char" || $_$ || x(centroid(transform(the_geom,
> 4326)))|| $_$ || y(centroid(transform(the_geom, 4326)));
>
> RETURN NEW;
> END IF;
> RETURN NULL;
> END;'
> LANGUAGE plpgsql;
>
> CREATE TRIGGER catalog_num_trigger AFTER UPDATE ON
> invasive_species.invspp_occurrence_data
> FOR EACH ROW EXECUTE PROCEDURE update_catalog_number();

It looks like the UPDATE statement within update_catalog_number() is
updating the entire invspp_occurrence_data table every time it gets
called -- that is, for every row which gets udpated in this table, a
full-table UPDATE is initiated by this trigger function. Is this
really what you need?

I didn't entirely understand your goals, but a much more common use of
trigger functions is roughly like this:
 * trigger is declared as BEFORE UPDATE instead of AFTER UPDATE as you have
 * trigger modifies column(s) of the row being updated by modifing the
NEW variable
 * trigger has RETURN NEW; at the end. You have RETURN NEW; as well as
RETURN NULL;, but because your trigger is an AFTER UPDATE trigger,
neither of these do anything useful.

See also Example 39-3 at:
http://developer.postgresql.org/pgdocs/postgres/plpgsql-trigger.html
for an example of a BEFORE INSERT OR UPDATE trigger.

Hope this helps..
Josh

В списке pgsql-novice по дате отправления:

Предыдущее
От: Josh Kupershmidt
Дата:
Сообщение: Re: pgstatspack version?
Следующее
От: Tom Lane
Дата:
Сообщение: Re: create function and trigger to update column on table update