Hasta ahora, eso es lo que sucede:
- Eliminar child1.
- Activa la eliminación del padre.
- Elimina
n
hermanos de child1 porDELETE CASCADE
. - Llama al mismo disparador
n
veces. - No quedan más hermanos.
Sin bucle sin fin, pero aun así n
invocaciones del gatillo. Eso podría explicar por qué se excedió el límite de profundidad de su pila, pero podría solucionarlo aumentando el límite. Lo mismo podría volver a ocurrir con un mayor n
.
Como alternativa, reemplace su gatillo 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();
Y reemplace la restricción FK con una versión sin ON DELETE CASCADE
. Ejemplo de código:
Ahora, para DELETE
toda una familia, no puede eliminar al padre como antes (ahora prohibido por FK). En su lugar, DELETE
cualquier niño.
También debería ser más rápido.