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

Responder a