Re: Creating Functions & Triggers
От | joseph speigle |
---|---|
Тема | Re: Creating Functions & Triggers |
Дата | |
Msg-id | 20040321180530.GA18007@www.sirfsup.com обсуждение исходный текст |
Ответ на | Re: Creating Functions & Triggers (Kevin Lohka <klohka@aboutfacedata.ab.ca>) |
Список | pgsql-novice |
On Sun, Mar 21, 2004 at 10:21:57AM -0700, Kevin Lohka wrote: > Thanks for the help Tom & Markus I've got it now. so did I so here is my version: drop table email; drop trigger email_mod_date; drop function email_mod_date(); create table email ( id serial not null primary key, email character varying(100), name character varying(100), m_date date, m_by_user character varying(100)); CREATE FUNCTION email_mod_date() RETURNS OPAQUE AS ' BEGIN new.m_date = current_date; new.m_by_user = current_user; RETURN new; END; 'LANGUAGE 'plpgsql'; CREATE TRIGGER email_mod_date_trigger BEFORE UPDATE ON email FOR EACH ROW EXECUTE PROCEDURE email_mod_date(); insert into email (email,name) values ('email1','name1'); insert into email (email,name) values ('email2','name2'); insert into email (email,name) values ('email3','name3'); select * from email; update email set email='email1_new' where name='name1'; select * from email; > > Kevin Lohka > > On Sunday, March 21, 2004, at 09:18 AM, Tom Lane wrote: > > >Markus Bertheau <twanger@bluetwanger.de> writes: > >>The trigger is probably recursively being called. > > > >Well, of course. Every UPDATE causes another UPDATE, which queues > >another trigger firing. What else would you expect but an infinite > >loop? > > > >The correct way to do this is illustrated in the plpgsql trigger > >example at the bottom of this page: > >http://www.postgresql.org/docs/7.4/static/plpgsql-trigger.html > >You use a BEFORE trigger and alter the NEW record before it gets > >written. > > > >AFTER triggers are not intended for modifying data in the record they > >are fired for --- it's too late for that. (Even if you avoid the > >infinite loop by testing whether you really need to do another UPDATE > >or not, it's still ridiculously inefficient to force another cycle of > >UPDATE when you could just as easily have gotten it right beforehand.) > >Usually people use AFTER triggers for end-of-command consistency > >checking or for propagating information to other tables. > > > > regards, tom lane > > > ---------------------------(end of broadcast)--------------------------- > TIP 4: Don't 'kill -9' the postmaster -- joe speigle www.sirfsup.com
В списке pgsql-novice по дате отправления: