Eu tenho uma função de gatilho que apenas copia os valores inseridos para outra tabela. Então, todas as noites, preciso descartar e recriar esse gatilho para alguma operação de exportação.
--trigger function
CREATE OR REPLACE FUNCTION mev_copy() RETURNS trigger AS $mev_copy$
BEGIN INSERT INTO measurement_events_copy SELECT NEW.*;
RETURN NEW;
END;
O problema é que às vezes o gatilho não pode ser iniciado: o comando CREATE TRRIGGER nunca retorna e o banco de dados parece travado e coloca todas as consultas no status "PARSE esperando". Ontem foi assim por 6 horas até eu matar o gatilho de criação.
O problema se manifesta consistentemente quando a tabela measurement_events está sendo aspirada automaticamente. Ao mesmo tempo, há uma nova solicitação AccessExclusiveLock pendente para esta tabela.
Este é o gatilho de criação, nada de especial:
--CREATE TRIGGER that hangs sometimes
CREATE TRIGGER mev_copy AFTER INSERT ON measurement_events FOR EACH ROW EXECUTE PROCEDURE mev_copy();
A versão do Postgres é 8.4. Alguma ideia?
Não pode ser feito com PG 8.4. Na verdade, está no TODO do postgres para reduzir os requisitos de gatilho: