Jak dotąd tak się dzieje:
- Usuń dziecko1.
- Powoduje usunięcie rodzica.
- Usuwa
n
rodzeństwo dziecka1 przezDELETE CASCADE
. - Wywołuje ten sam wyzwalacz
n
razy. - 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.