PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Limite de profondeur de pile dépassée dans PostgresQL (après le déclencheur de suppression)

Jusqu'à présent, c'est ce qui se passe :

  1. Supprimer enfant1.
  2. Déclenche la suppression du parent.
  3. Supprime n frères et sœurs de child1 par DELETE CASCADE .
  4. Appelle le même déclencheur n fois.
  5. Plus de frères et sœurs.

Pas de boucle sans fin, mais toujours n appels du déclencheur. Cela pourrait expliquer pourquoi votre limite de profondeur de pile a été dépassée, mais vous pouvez y remédier en augmentant la limite. La même chose pourrait se reproduire avec un plus grand n .

Comme alternative, remplacez votre déclencheur par :

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();

Et remplacez la contrainte FK par une version sans ON DELETE CASCADE . Exemple de code :

Maintenant, pour DELETE une famille entière, vous ne pouvez pas supprimer le parent comme avant (maintenant interdit par FK). Au lieu de cela DELETE n'importe quel enfant.

Ça devrait aussi être plus rapide.