sql >> Base de Datos >  >> RDS >> PostgreSQL

Se excedió el límite de profundidad de pila en PostgresQL (después de eliminar el activador)

Hasta ahora, eso es lo que sucede:

  1. Eliminar child1.
  2. Activa la eliminación del padre.
  3. Elimina n hermanos de child1 por DELETE CASCADE .
  4. Llama al mismo disparador n veces.
  5. 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.