Re: Question on setting up trigger.

From: Andrew McMillan <Andrew(at)catalyst(dot)net(dot)nz>
To: Alan Young <alany(at)idiglobal(dot)com>
Cc: pgsql-novice(at)postgresql(dot)org
Subject: Re: Question on setting up trigger.
Date: 2001-01-05 09:48:33
Message-ID: 3A559871.3341DEA0@catalyst.net.nz
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-novice

Alan Young wrote:
>
> I have the following table:
>
> CREATE TABLE category (
> id int NOT NULL DEFAULT nextval('_base_id_seq'::text) PRIMARY
> KEY,
> parentid int REFERENCES category ( id )
> name text,
> );
>
> This allows me to have any number of subcategories without worrying
> about how many someone might have.
>
> And I have a function that sets the parentid to the parents parentid
> (used when deleting a category) that looks like this:
>
> CREATE FUNCTION "move_catparent" (int4 )
> RETURNS int4
> AS 'UPDATE category
> SET parentid = ( SELECT parentid FROM category WHERE id = $1 )
> WHERE parentid = $1;
> SELECT 1 AS RESULT'
> LANGUAGE 'SQL';
>
> As it stands, I have to do the following when deleting a category:
>
> SELECT move_catparent( <id of category being deleted> );
> DELETE FROM category WHERE id=<id of category being deleted>;
>
> I'd like to create a trigger so that I just have to delete the category
> and the move_catparent function will be automatically called. I've read
> the CREATE TRIGGER documentation, but I'm just not seeing it.
>
> Can anyone give me some pointers? Thanks.

Looks to me like you should be able to:

CREATE FUNCTION move_catparent_trigger() RETURNS OPAQUE AS '
DECLARE
old_id INT4;
old_parent_id INT4;
BEGIN
IF TG_OP = ''DELETE'' THEN
deleted_id := OLD.id ;
deleted_parentid := OLD.parentid ;
UPDATE category SET parentid = deleted_parentid WHERE parentid =
deleted_id;
END IF;
RETURN NEW;
END;
' LANGUAGE 'plpgsql';
CREATE TRIGGER move_catparent_trigger
AFTER DELETE ON category
FOR EACH ROW EXECUTE PROCEDURE move_catparent_trigger();

I usually find that I end up writing trigger procedures in PLPGSQL
because you can make them so much more maintainable.

Hope this helps,
Andrew.

--
_____________________________________________________________________
Andrew McMillan, e-mail: Andrew(at)catalyst(dot)net(dot)nz
Catalyst IT Ltd, PO Box 10-225, Level 22, 105 The Terrace, Wellington
Me: +64 (21) 635 694, Fax: +64 (4) 499 5596, Office: +64 (4) 499 2267

In response to

Browse pgsql-novice by date

  From Date Subject
Next Message rob 2001-01-05 13:24:34 Re: Casting
Previous Message Anthony E . Greene 2001-01-05 06:05:11 Re: Trailing spaces in char or varchar fields