Jak dotąd tak się dzieje:
- Usuń dziecko1.
- Powoduje usunięcie rodzica.
- Usuwa
nrodzeństwo dziecka1 przezDELETE CASCADE. - Wywołuje ten sam wyzwalacz
nrazy. - Nie ma więcej rodzeństwa.
Bez niekończącej się pętli, ale nadal n wywołania wyzwalacza. To może wyjaśniać, dlaczego limit głębokości stosu został przekroczony, ale możesz to naprawić, zwiększając limit. To samo może się powtórzyć z większym n .
Alternatywnie wymień wyzwalacz na:
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();
I zastąp ograniczenie FK wersją bez ON DELETE CASCADE . Przykład kodu:
Teraz, DELETE całej rodziny, nie możesz usunąć rodzica jak wcześniej (teraz zabronione przez FK). Zamiast tego DELETE każde dziecko.
Powinno być też szybsze.