Обсуждение: Trigger Update Issue
Hello All
I'm running 7.3.4-1 on a RH9 box. I'm having a problem with a trigger
that seems to execute without actually performing the update that it
should. The update returns true everytime however if it is the first time
that the trigger executes on a given row, the column is not updated. The
column is updated correctly on subsequent calls.
Here is the code:
create table tabA (
id char(32) primary key not null,
Acol1 char(40) not null unique,
Acol2 integer not null,
Acol3 integer default 0 check ( Acol3 >= 0),
);
create table tabB (
id integer default nextval('tabB_id_seq'::text)
not null check (id > 0) primary key,
tabA_id char(32) not null references tabA (id)
on delete cascade on update cascade,
Bcol1 text default null,
Bcol2 text default null,
);
CREATE OR REPLACE FUNCTION "tabB_postinsert" () RETURNS TRIGGER AS '
--
-- Actions to take after inserting into tabB
--
BEGIN
-- Increment tabA.attachments
UPDATE tabA SET Acol3 = Acol3 + 1 WHERE id = NEW.tabA_id;
-- done
RETURN NEW;
END; ' LANGUAGE 'plpgsql';
CREATE TRIGGER "master_tabB_postinsert"
AFTER INSERT ON "tabB"
FOR EACH ROW EXECUTE PROCEDURE "tabB_postinsert" ();
I am using this same trigger structure on other tables without having any
issues. Any insight would be greatly appreciated.
Thanks
-b
On Friday 05 March 2004 14:00, beer wrote: > Hello All > > I'm running 7.3.4-1 on a RH9 box. I'm having a problem with a trigger > that seems to execute without actually performing the update that it > should. The update returns true everytime however if it is the first time > that the trigger executes on a given row, the column is not updated. The > column is updated correctly on subsequent calls. Perhaps put some debug code in and insert into tabB manually > CREATE OR REPLACE FUNCTION "tabB_postinsert" () RETURNS TRIGGER AS ' > -- > -- Actions to take after inserting into tabB > -- DECLARE numrows int4; > BEGIN > -- Increment tabA.attachments > UPDATE tabA SET Acol3 = Acol3 + 1 WHERE id = NEW.tabA_id; GET DIAGNOSTICTS numrows = ROW_COUNT; RAISE NOTICE ''Updated % rows with id = %'',numrows, NEW.tabA_id; > -- done > RETURN NEW; > END; ' LANGUAGE 'plpgsql'; Insert into tabB from psql and you should see a NOTICE message telling you what is happening. -- Richard Huxton Archonet Ltd
Richard Thanks for the suggestion. I had tried something similar using FOUND but that didnt not give me the number of rows touched. According to the output, 1 row was updated, however when I select on the row the value is still 0. -b > On Friday 05 March 2004 14:00, beer wrote: >> Hello All >> >> I'm running 7.3.4-1 on a RH9 box. I'm having a problem with a trigger >> that seems to execute without actually performing the update that it >> should. The update returns true everytime however if it is the first >> time >> that the trigger executes on a given row, the column is not updated. >> The >> column is updated correctly on subsequent calls. > > Perhaps put some debug code in and insert into tabB manually > >> CREATE OR REPLACE FUNCTION "tabB_postinsert" () RETURNS TRIGGER AS ' >> -- >> -- Actions to take after inserting into tabB >> -- > DECLARE > numrows int4; > >> BEGIN >> -- Increment tabA.attachments >> UPDATE tabA SET Acol3 = Acol3 + 1 WHERE id = NEW.tabA_id; > GET DIAGNOSTICTS numrows = ROW_COUNT; > RAISE NOTICE ''Updated % rows with id = %'',numrows, NEW.tabA_id; >> -- done >> RETURN NEW; >> END; ' LANGUAGE 'plpgsql'; > > Insert into tabB from psql and you should see a NOTICE message telling you > what is happening. > > -- > Richard Huxton > Archonet Ltd > >
"beer" <beer@cmu.edu> writes:
> I'm running 7.3.4-1 on a RH9 box. I'm having a problem with a trigger
> that seems to execute without actually performing the update that it
> should. The update returns true everytime however if it is the first time
> that the trigger executes on a given row, the column is not updated. The
> column is updated correctly on subsequent calls.
I couldn't reproduce this. I created the tables and trigger and then
did:
regression=# insert into tabA values('id1','col1', 2, 32);
INSERT 154119 1
regression=# insert into tabB values(1,'id1','col1','col2');
INSERT 154120 1
regression=# select * from tabA;
id | acol1 | acol2 | acol3
----------------------------------+------------------------------------------+-------+-------
id1 | col1 | 2 | 33
(1 row)
regression=# insert into tabB values(2,'id1','col1','col2');
INSERT 154121 1
regression=# select * from tabA;
id | acol1 | acol2 | acol3
----------------------------------+------------------------------------------+-------+-------
id1 | col1 | 2 | 34
(1 row)
It looks fine to me ... what are you doing differently?
regards, tom lane