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

postgres. limite de profundidade da pilha plpgsql excedido


Ok, se você realmente deseja o gatilho na atualização, o que você pode fazer é definir esse gatilho como específico da coluna, para que ele não seja acionado em uma atualização para all_books , que está causando sua recursão. Algo assim -
create trigger total2
after update of copy_id
on totalbooks
for each row
execute procedure total1();

Claro, você pode alterar quais colunas acionam a função, eu apenas escolhi copy_id porque é isso que você está contando.

CONTUDO

Se você estiver atualizando com um count() resultado, você pode simplesmente colocar o gatilho em INSERT e DELETE ações. Dessa forma, o gatilho será acionado quando a contagem for alterada, mas não será acionado pela atualização. // EDIT:Desde sua sum é apenas uma contagem de todos os registros em copies , ele só mudará quando um registro for inserido ou atualizado, portanto, executar esse gatilho na atualização não faria sentido de qualquer maneira.

EDIT:Achei que seria útil adicionar um link para o CREATE Documentação do TRIGGER . Consulte a seção rotulada "evento", pois ela detalha como especificar colunas no evento.

EDITAR PARA NOVAS INFORMAÇÕES:


Dado o que parece que você precisa realizar, acho que você precisa repensar seu design de dados, sugiro que use um relacionamento pai-filho (sempre que estiver armazenando em cache dados compartilhados em muitas linhas em uma tabela porque eles compartilham algo em comum, que é um sinal de que você pode precisar de uma tabela pai).

Tenha um books tabela onde cada linha é informação sobre um livro (título, autor, etc), e então tem um copies tabela onde cada linha contém informações sobre uma cópia de um livro (número de série, último check-out, etc).

Dessa forma, obter a contagem de cópias é tão simples quanto SELECT COUNT(*) FROM copies WHERE book_id=[some book id] .

Se você realmente deseja armazenar em cache a contagem em algum lugar, faça isso nos books tabela.

Crie um INSERT OR UPDATE acionar em copies que faz UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=NEW.book_id) WHERE id=NEW.book_id .

Em seguida, crie um DELETE acionado em cópias que UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=OLD.book_id) WHERE id=OLD.book_id

A razão para dois gatilhos é que o NEW variável só está disponível em INSERT ou UPDATE gatilhos e OLD está disponível apenas em DELETE gatilhos. Você poderia fazer tudo como um gatilho, mas isso requer mais código do que eu queria colocar aqui.

Verifique se todos os seus acionadores estão AFTER acionadores, ou então uma linha recém-inserida/excluída não será considerada na contagem.