begin; -- apisano 2018-02-21: -- - added proper removal of cr_child_rels when item is deleted. -- - streamlined idioms -- - added missing on delete cascade -- - removed dead acs_objects formerly linked to deleted cr_child_rels -- Cleanup -- This is not done unless uncommented, because could take a long time on busy sites! -- -- delete dead tuples coming from sins of the past (mostly erased portraits) -- select acs_object__delete(object_id) from acs_objects o -- where object_type = 'cr_item_child_rel' and -- not exists (select 1 from cr_child_rels where rel_id = o.object_id); -- Data model upgrade alter table images -- current name of the constraint drop constraint if exists images_image_id_fk, -- old name of the same constraint in old databases drop constraint if exists "$1", add constraint images_image_id_fk foreign key (image_id) references cr_revisions(revision_id) on delete cascade; alter table cr_revision_attributes drop constraint cr_revision_attributes_fk, add constraint cr_revision_attributes_fk foreign key (revision_id) references cr_revisions(revision_id) on delete cascade; -- -- procedure content_item__del/1 -- CREATE OR REPLACE FUNCTION content_item__del( delete__item_id integer ) RETURNS integer AS $$ BEGIN -- Also child relationships must be deleted. On delete cascade -- would not help here, as related acs_object would stay. PERFORM acs_object__delete(object_id) from acs_objects where object_id in (select rel_id from cr_child_rels where child_id = delete__item_id or parent_id = delete__item_id); -- -- Delete all revisions of this item -- -- On delete cascade should work for us, but not in case of -- relationships. Therefore, we call acs_object__delete explicitly -- on the revisions. Is is also safer in general, as referential -- integrity might not have been enforced every time. -- PERFORM acs_object__delete(revision_id) from cr_revisions where item_id = delete__item_id; -- -- Delete all children of this item via a recursive call. -- -- On delete cascade should work for us, but not in case of -- relationships. Therefore, we call acs_object__delete explicitly -- on the revisions. Is is also safer in general, as referential -- integrity might not have been enforced every time. -- PERFORM content_item__delete(item_id) from cr_items where parent_id = delete__item_id; -- -- Finally, delete the acs_object of the item. -- PERFORM acs_object__delete(delete__item_id); return 0; END; $$ LANGUAGE plpgsql; end;