Até agora você é o que acontece:
- Excluir filho1.
- Aciona a exclusão do pai.
- Exclui
n
irmãos de child1 porDELETE CASCADE
. - Chama o mesmo acionador
n
vezes. - 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.