Subqueries failing inside pl/pgsql fuction called by trigger

From: bob_bamber(at)hotmail(dot)com (Bob)
To: pgsql-general(at)postgresql(dot)org
Subject: Subqueries failing inside pl/pgsql fuction called by trigger
Date: 2004-04-06 17:28:51
Message-ID: b598ae2.0404060928.d87c4ab@posting.google.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Hi,

I have a very odd postgresql problem.

I have some subqueries contained within a function which are looking
for unrefernced data and then delete any rows that are found:

CREATE OR REPLACE FUNCTION housekeeping()
RETURNS TRIGGER AS '
BEGIN
DELETE FROM properties WHERE NOT EXISTS (SELECT property_id FROM
properties_vw WHERE property_id = properties.property_id);
DELETE FROM promotions_lookup WHERE promotions_lookup.web_end <
CURRENT_DATE;
DELETE FROM accommodation_page WHERE NOT EXISTS (SELECT
accommodation_page_id FROM accommodation_page_vw WHERE
accommodation_page.accommodation_page_id = accommodation_page_id);
DELETE FROM location_page WHERE NOT EXISTS (SELECT location_page_id
FROM location_page_vw WHERE location_page.location_page_id =
location_page_id);
DELETE FROM dining_page WHERE NOT EXISTS (SELECT dining_page_id FROM
dining_page_vw WHERE dining_page.dining_page_id = dining_page_id);
DELETE FROM meeting_page WHERE NOT EXISTS (SELECT meeting_page_id
FROM meeting_page_vw WHERE meeting_page.meeting_page_id =
meeting_page_id);
DELETE FROM meeting_specials WHERE NOT EXISTS (SELECT
meeting_specials_id FROM meeting_specials_vw WHERE
meeting_specials.meeting_specials_id = meeting_specials_id);
DELETE FROM meeting_rooms WHERE NOT EXISTS (SELECT room_id FROM
meeting_rooms_lookup WHERE meeting_rooms_lookup.room_id =
meeting_rooms.room_id);
DELETE FROM capacity_data WHERE NOT EXISTS (SELECT data_id FROM
capacities WHERE capacities.data_id = capacity_data.data_id);
DELETE FROM billboard WHERE NOT EXISTS (SELECT billboard_id from
billboard_vw WHERE billboard.billboard_id = billboard_id);
DELETE FROM images WHERE NOT EXISTS (SELECT image_id FROM images_vw
WHERE images.image_id = image_id);
DELETE FROM promotions_lookup WHERE NOT EXISTS (SELECT property_id
FROM properties_vw WHERE property_id = properties.property_id);
RETURN NULL;
END; '
LANGUAGE plpgsql;

I then call the function using this trigger:

CREATE TRIGGER a_delete_brand_trigger
AFTER DELETE
ON brands FOR EACH ROW
EXECUTE PROCEDURE housekeeping();

So I am expecting a query like:

DELETE FROM brands WHERE brand_id = 10;

to fire the trigger which executes function containing the delete
statements and this in turn, removes any unreferenced data.

However, I'm finding that not all of my DELETE statements within the
function are being executed. If I run the statements outside of the
function they work. Indeed, if I SELECT housekeeping(); all of the
statements are executed.

Can any body see why when the function is called by the trigger only
some of the statements are executed?

DELETE FROM properties WHERE NOT EXISTS (SELECT property_id FROM
properties_vw WHERE property_id = properties.property_id);
DELETE FROM promotions_lookup WHERE promotions_lookup.web_end <
CURRENT_DATE;

The two above ALWAYS work. The rest seem to be exectued but they do
not effect any rows.

What's going on?

Many thanks,

Rob.

Browse pgsql-general by date

  From Date Subject
Next Message Stephan Szabo 2004-04-06 17:32:34 Re: Create Type Problem
Previous Message scott.marlowe 2004-04-06 17:17:03 Re: Crash in postgres/linux on verly large database