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
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 |