Thread: Function and trigger

Function and trigger

From
Ola Ekedahl
Date:
Hi,

I have e problem with a function (plpgsql) and a trigger in my database.
Postgres and triggers/functions are new to me...

Anyway, the database is filled with larg amounts of measurements, we are
talking about a couple of hundres of thousands of posts per day.
I want to create a function that checks for a specific type of
measurement and then copies it's value to another table. The functions
looked almost like this:

BEGIN

IF NEW.TYPE=100 THEN
 INSERT INTO newtable (type,quantity) VALUES (NEW.TYPE, NEW.QUANTITY);
END IF;

END;

I tried to run a similar function (not created for use with a trigger)
on a dummy table, and it inserted the values I told it to without any
errors. I know that the function is correct and shouldnt give me any errors.

But when I tried to run the followin function with a trigger on the
"real" table with the real data it just didnt work! The "real" table is
not filled with any more data and the "newtable" isnt filled with any
data either!

I must have missed something very important!?

Best regards and thanks in advance!
Ola

Re: Function and trigger

From
"A. Kretschmer"
Date:
am  Fri, dem 05.12.2008, um 11:02:52 +0100 mailte Ola Ekedahl folgendes:
> Hi,
>
> I have e problem with a function (plpgsql) and a trigger in my database.
> Postgres and triggers/functions are new to me...
>
> Anyway, the database is filled with larg amounts of measurements, we are
> talking about a couple of hundres of thousands of posts per day.
> I want to create a function that checks for a specific type of
> measurement and then copies it's value to another table. The functions
> looked almost like this:
>
> BEGIN
>
> IF NEW.TYPE=100 THEN
> INSERT INTO newtable (type,quantity) VALUES (NEW.TYPE, NEW.QUANTITY);
> END IF;
>
> END;


Thats not a complete function. Okay, see below:

test=# create table measurements(type int, quantity int);
CREATE TABLE
test=*# create table newtable(type int, quantity int);
CREATE TABLE
test=*# create function trg_newtable() returns trigger as $$begin IF NEW.TYPE=100 THEN INSERT INTO newtable
(type,quantity)VALUES (NEW.TYPE, NEW.QUANTITY); END IF; return new; END; $$language plpgsql; 
CREATE FUNCTION
test=*# create trigger mytrigger before insert on measurements for each row execute procedure trg_newtable();
CREATE TRIGGER
test=*# insert into measurements values (1,1);
INSERT 0 1
test=*# insert into measurements values (100,100);
INSERT 0 1
test=*# select * from measurements;
 type | quantity
------+----------
    1 |        1
  100 |      100
(2 rows)

test=*# select * from newtable;
 type | quantity
------+----------
  100 |      100
(1 row)



Andreas
--
Andreas Kretschmer
Kontakt:  Heynitz: 035242/47150,   D1: 0160/7141639 (mehr: -> Header)
GnuPG-ID:   0x3FFF606C, privat 0x7F4584DA   http://wwwkeys.de.pgp.net

Re: Function and trigger

From
Tovo Rabemanantsoa
Date:
Ola Ekedahl wrote:
> Hi,
>
> I have e problem with a function (plpgsql) and a trigger in my database.
> Postgres and triggers/functions are new to me...
>
> Anyway, the database is filled with larg amounts of measurements, we are
> talking about a couple of hundres of thousands of posts per day.
> I want to create a function that checks for a specific type of
> measurement and then copies it's value to another table. The functions
> looked almost like this:
>
> BEGIN
>
> IF NEW.TYPE=100 THEN
> INSERT INTO newtable (type,quantity) VALUES (NEW.TYPE, NEW.QUANTITY);
> END IF;
>
> END;
>
> I tried to run a similar function (not created for use with a trigger)
> on a dummy table, and it inserted the values I told it to without any
> errors. I know that the function is correct and shouldnt give me any
> errors.
>
> But when I tried to run the followin function with a trigger on the
> "real" table with the real data it just didnt work! The "real" table is
> not filled with any more data and the "newtable" isnt filled with any
> data either!
>
> I must have missed something very important!?
>
> Best regards and thanks in advance!
> Ola
>
Hi,
did you tried something like this ?

CREATE OR REPLACE FUNCTION trig_insert_flux()
   RETURNS "trigger" AS
$BODY$DECLARE
  IF NEW.TYPE=100 THEN
  INSERT INTO newtable (type,quantity) VALUES (NEW.TYPE, NEW.QUANTITY);
  END IF;
BEGIN

END;$BODY$
   LANGUAGE 'plpgsql' VOLATILE;
And after on your table :


CREATE TRIGGER trig_insert_flux
   AFTER (or BEFORE, it depends) INSERT
   ON firstable
   FOR EACH ROW
   EXECUTE PROCEDURE trig_insert_flux();

--
Tovo J. RABEMANANTSOA
INRA - UR1263 EPHYSE
71, Av. Edouard Bourlaux
F-33140 Villenave d'Ornon - France
Téléphone : +33 5 57 12 24 09


Re: Function and trigger

From
Ola Ekedahl
Date:
Hi,

Thanks for the reply! I tried the exact same "code" you posted, and on
the newly created tables it works!
But when I make a trigger on the "real" table with the real incoming
data it wont work!

No data is filled in the either table... When I delete the trigger, the
data is posted into the measutements table again.

I cant figure out why. Could it be because it lags behind, its to much
data for it to handle?

On the other hand, if I do a notify instead of an insert, it seems to
work ok.

Any more ideas?

Best regards
Ola

A. Kretschmer skrev:
> am  Fri, dem 05.12.2008, um 11:02:52 +0100 mailte Ola Ekedahl folgendes:
>
>> Hi,
>>
>> I have e problem with a function (plpgsql) and a trigger in my database.
>> Postgres and triggers/functions are new to me...
>>
>> Anyway, the database is filled with larg amounts of measurements, we are
>> talking about a couple of hundres of thousands of posts per day.
>> I want to create a function that checks for a specific type of
>> measurement and then copies it's value to another table. The functions
>> looked almost like this:
>>
>> BEGIN
>>
>> IF NEW.TYPE=100 THEN
>> INSERT INTO newtable (type,quantity) VALUES (NEW.TYPE, NEW.QUANTITY);
>> END IF;
>>
>> END;
>>
>
>
> Thats not a complete function. Okay, see below:
>
> test=# create table measurements(type int, quantity int);
> CREATE TABLE
> test=*# create table newtable(type int, quantity int);
> CREATE TABLE
> test=*# create function trg_newtable() returns trigger as $$begin IF NEW.TYPE=100 THEN INSERT INTO newtable
(type,quantity)VALUES (NEW.TYPE, NEW.QUANTITY); END IF; return new; END; $$language plpgsql; 
> CREATE FUNCTION
> test=*# create trigger mytrigger before insert on measurements for each row execute procedure trg_newtable();
> CREATE TRIGGER
> test=*# insert into measurements values (1,1);
> INSERT 0 1
> test=*# insert into measurements values (100,100);
> INSERT 0 1
> test=*# select * from measurements;
>  type | quantity
> ------+----------
>     1 |        1
>   100 |      100
> (2 rows)
>
> test=*# select * from newtable;
>  type | quantity
> ------+----------
>   100 |      100
> (1 row)
>
>
>
> Andreas
>