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.