Re: help with plpgsql function called by trigger - Mailing list pgsql-general

From Heather Johnson
Subject Re: help with plpgsql function called by trigger
Date
Msg-id 4239AB06.801@nypost.com
Whole thread Raw
In response to Re: help with plpgsql function called by trigger  (Alban Hertroys <alban@magproductions.nl>)
List pgsql-general
Thank you! That *is* nicer. And thanks to Michael Fuhr too for his
reference to the appropriate docs and suggestions. Between your two
responses, I have a much better sense of how to go about this and where
to look for extra help.

Heather

Alban Hertroys wrote:
> Heather Johnson wrote:
>
>> Hello--
>>
>> I need to make sure that every time a row is inserted into a table
>> called "users" rows are automatically inserted into two other tables:
>> "join_bd" and "behavior_demographics". The inserts on join_bd and
>> behavior_demographics need to create rows that are keyed to the users
>> table with an integer id (called "users_id"). The join_bd row that's
>> created also needs to contain a key for a record in
>> behavior_demographics (bd_id). Here's what I did to try and accomplish
>> this:
>>
>> CREATE FUNCTION insert_bd_join_bd (integer) RETURNS opaque AS '
>> declare
>>     r RECORD;
>>         uid ALIAS FOR $1;
>> begin
>>     INSERT INTO behavioral_demographics (users_id) VALUES (uid);
>>     SELECT INTO r bdid FROM behavioral_demographics WHERE users_id=uid;
>>     INSERT INTO join_bd (bd_id, users_id) VALUES (bdid, uid);
>> end;
>> ' LANGUAGE 'plpgsql';
>
>
> Wouldn't it be nicer to put the second part of that SP in a trigger on
> behavioral_demographics? That can only work if inserting into users is
> the only way to insert records into behavioral_demographics, of course.
>
> I don't know the names of your columns in behavioral_demographics, but
> it would look something like this:
>
> CREATE FUNCTION insert_bd () RETURNS trigger AS '
> begin
>     INSERT INTO behavioral_demographics (users_id)
>     VALUES (NEW.users_id);    -- fires trigger on bd
> end;
> ' LANGUAGE 'plpgsql';
>
> CREATE FUNCTION insert_join_bd () RETURNS trigger AS '
> begin
>     INSERT INTO join_bd (bd_id, users_id)
>     VALUES (NEW.bd_id, NEW.users_id);
> end;
> ' LANGUAGE 'plpgsql';
>
> CREATE TRIGGER insert_bd_on_users
> AFTER INSERT ON users
> FOR EACH ROW EXECUTE PROCEDURE insert_bd();
>
> CREATE TRIGGER insert_join_bd_on_users
> AFTER INSERT ON behavioral_demographics
> FOR EACH ROW EXECUTE PROCEDURE insert_join_bd();
>
>
> Considering these SP's are basically simple SQL statements, the triggers
> could also be implemented as a set of query rewrite rules (see CREATE
> RULE). That's usually more efficient, but I don't have a lot of
> experience with those...
>
> Regards,
>

pgsql-general by date:

Previous
From: Tom Lane
Date:
Subject: Re: plpython function problem workaround
Next
From: Michal Hlavac
Date:
Subject: GUID data type support