PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Limite di profondità dello stack superato in PostgresQL (dopo l'eliminazione del trigger)

Finora è quello che succede:

  1. Elimina figlio1.
  2. Attiva l'eliminazione del genitore.
  3. Elimina n fratelli di child1 da DELETE CASCADE .
  4. Chiama lo stesso attivatore n volte.
  5. 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.