Засега се случва това:
- Изтриване на дете1.
- Задейства изтриване на родител.
- Изтрива
nбратя и сестри на дете1 отDELETE CASCADE. - Извиква същия тригер
nпъти. - Няма останали повече братя и сестри.
Без безкраен цикъл, но все пак n извиквания на тригера. Това може да обясни защо лимитът на дълбочината на стека е надвишен, но можете да го поправите, като увеличите лимита. Същото може да се случи отново с по-голямо n .
Като алтернатива заменете тригера си с:
CREATE OR REPLACE FUNCTION delete_family()
RETURNS TRIGGER AS
$func$
BEGIN
DELETE FROM child WHERE parent_id = OLD.parent_id;
DELETE FROM parent WHERE parent_id = OLD.parent_id; -- done after 1st call
RETURN NULL;
END
$func$ LANGUAGE plpgsql; -- don't quote the language name!
CREATE TRIGGER delete_family
AFTER DELETE ON child
FOR EACH ROW EXECUTE PROCEDURE delete_family();
И заменете ограничението FK с версия без ON DELETE CASCADE . Пример за код:
Сега към DELETE цяло семейство, не можеш да изтриеш родителя както преди (сега е забранено от FK). Вместо DELETE всяко дете.
Трябва да е и по-бързо.