Finora è quello che succede:
- Elimina figlio1.
- Attiva l'eliminazione del genitore.
- Elimina
n
fratelli di child1 daDELETE CASCADE
. - Chiama lo stesso attivatore
n
volte. - Non sono rimasti più fratelli.
Nessun ciclo infinito, ma ancora n
invocazioni del trigger. Ciò potrebbe spiegare perché il limite di profondità dello stack è stato superato, ma è possibile risolverlo aumentando il limite. Lo stesso potrebbe accadere di nuovo con un n
maggiore .
In alternativa, sostituisci il tuo trigger con:
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();
E sostituisci il vincolo FK con una versione senza ON DELETE CASCADE
. Esempio di codice:
Ora, per DELETE
un'intera famiglia, non puoi cancellare il genitore come prima (ora vietato da FK). Invece DELETE
qualsiasi bambino.
Dovrebbe essere anche più veloce.