Hasta ahora, eso es lo que sucede:
- Eliminar child1.
- Activa la eliminación del padre.
- Elimina
nhermanos de child1 porDELETE CASCADE. - Llama al mismo disparador
nveces. - 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.