PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Limite de profundidade de pilha excedido no PostgresQL (após excluir gatilho)


Até agora você é o que acontece:
  1. Excluir filho1.
  2. Aciona a exclusão do pai.
  3. Exclui n irmãos de child1 por DELETE CASCADE .
  4. Chama o mesmo acionador n vezes.
  5. Não há mais irmãos.

Sem loop infinito, mas ainda n invocações do gatilho. Isso pode explicar por que o limite de profundidade da pilha foi excedido, mas você pode corrigi-lo aumentando o limite. O mesmo pode acontecer novamente com um n maior .

Como alternativa, substitua seu gatilho por:
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 substitua a restrição FK por uma versão sem ON DELETE CASCADE . Exemplo de código:

Agora, para DELETE uma família inteira, você não pode excluir o pai como antes (agora proibido pelo FK). Em vez disso, DELETE qualquer criança.

Deve ser mais rápido também.