Olá, Euler Eu tentei fazer algumas simulações para tentar capturar o erro mas não consegui. O ambiente é de bastente escrita (insert) e ao adicionar uma nova tabela com uma constraint de foreign key percebi o erro no arquivo de log do Postgres.
O que descobri é que depois de um deadlock a mensagem de erro era apresentada. As consultas que você comentou eu já havia feito e os valores eram divergentes, o valor de reltriggers da pg_class era sempre menor que o número de triggers em pg_trigger. Tentei fazer um update no catálogo mas sem sucesso. O que percebi é que a constraint criada havia uma entrada para ela em pg_trigger porém a coluna reltriggers da pg_class não havia sido atualizada. Tentei fazer a alteração na diretamente no catalogo porem sem sucesso. Abri uma transação e executei um update na pg_class e o resultado do update era 1 (uma linha atualizada) porém o valor da coluna não era modificado, visto que o select retornava o valor de antes da minha operação de update. 2009/10/17 Euler Taveira de Oliveira <[email protected]> > JotaComm escreveu: > > Não. O erro apareceu depois que um deadlock foi detectado no banco. A > > versão que estamos usando é a 8.3.3. > > > Sem um exemplo do que está fazendo fica difícil prever algo. Lembro-me que > alguns travamentos (aka _locks_) foram evitados na parte de gatilhos. > [Olhando > o código...] Realmente a minha memória estava boa [1]. A partir da 8.4 esse > código foi refatorado e esse erro não aparece mais. > > Voltando ao seu problema, acho que você "corrompeu" o seu catálogo. É isso > que > a mensagem quer dizer. Faça as seguintes consultas: > > euler=# select tgrelid::regclass, tgfoid::regproc, tgname from pg_trigger > where tgrelid = 'foo'::regclass; > tgrelid | tgfoid | tgname > ---------+------------------------+---------------------------- > foo | "RI_FKey_noaction_del" | RI_ConstraintTrigger_16462 > foo | "RI_FKey_noaction_upd" | RI_ConstraintTrigger_16463 > (2 registros) > > euler=# select relname, reltriggers from pg_class where oid = > 'foo'::regclass; > relname | reltriggers > ---------+------------- > foo | 2 > (1 registro) > > Você terá problemas caso o número de registros da primeira consulta seja > diferente de 'reltriggers' apresentado na segunda consulta. Neste caso > sugiro > ajustar 'reltriggers' para o valor correto. > Quando percebi a diferença olhando as tabelas de sistema tentei fazer isso, mas não consegui. Não consegui atualizar o reltriggers de pg_class :( Tentei reindexar o catálogo mas também não tive sucesso, o erro persistia. Tudo que eu podia fazer acho que fiz, porém sem sucesso :( > > > [1] http://archives.postgresql.org/pgsql-committers/2008-11/msg00092.php > > > -- > Euler Taveira de Oliveira > http://www.timbira.com/ > _______________________________________________ > pgbr-geral mailing list > [email protected] > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral > Obrigado pelos comentários. Legal saber que a linha de raciocinio que tomei é a mesma abordagem que você tomaria. Acho que estou começando a pensar com os gurus do PostgreSQL pensam :) PS: Te espero para tomarmos um chopp no PGCon :) []s -- JotaComm http://jotacomm.wordpress.com
_______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
