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@catalyst.net.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