Re: recursive trigger
От | Mage |
---|---|
Тема | Re: recursive trigger |
Дата | |
Msg-id | 404B799C.8000106@mage.hu обсуждение исходный текст |
Ответ на | Re: recursive trigger (Tom Lane <tgl@sss.pgh.pa.us>) |
Список | pgsql-general |
Tom Lane wrote: > > >You should just do > > if new.parent <> old.parent then > new.name = ''old''; > >As you have it, the inner UPDATE pre-empts the outer because it is >applied first. When control comes back from the trigger, the row >the trigger was handed is now dead (already updated) and can't be >updated again. > > Okay, above is an easy example. My original conception was maintaining the article_index (for sorting) this way: create table article ( article_id bigserial primary key, tree_id bigint not null, article_index int, article_name varchar ); create or replace function article_index() returns trigger as ' declare maxindex int; begin if TG_OP = ''INSERT'' then select into maxindex article_index from article where tree_id = new.tree_id order by article_index desc limit 1; new.article_index = COALESCE(maxindex + 1, 1); return new; elsif TG_OP = ''UPDATE'' then if new.tree_id <> old.tree_id then select into maxindex article_index from article where tree_id = new.tree_id order by article_index desc limit 1; new.article_index = COALESCE(maxindex + 1, 1); update article set article_index = article_index - 1 where article_index > old.article_index and tree_id = old.tree_id and article_id <> old.article_id; -- this won't work end if; return new; elsif TG_OP = ''DELETE'' then update article set article_index = article_index - 1 where article_index > old.article_index and tree_id = old.tree_id; return old; end if; end; ' language plpgsql; create trigger article_index before insert or update or delete on article for each row execute procedure article_index(); insert into article (article_name, tree_id) values ('a',1); insert into article (article_name, tree_id) values ('b',1); insert into article (article_name, tree_id) values ('c',1); update article set tree_id = 2; ----- I don't understand, what's the problem, because the inner update never updates the actual row fired the trigger. (the "old.article_id <> article_id" condition is not necessary btw.). Does this mean, if i change any other rows in a row level before update trigger, rows changed won't be updated anymore in the same statement? Mage
В списке pgsql-general по дате отправления: