Olá, Rogério

Em 16 de novembro de 2011 09:41, Rogério Grando <[email protected]
> escreveu:

>   Olá pessoal,
> Estive em umas das palestras do PgBr deste ano  “Estatísticas e
> monitoramento e diagnósticos através do catalogo do PostgreSQL” e expus um
> problema que havia ocorrido na mesma semana referente a catálogo, demorei
> um pouco para postar porque estava tentando simular novamente o problema.
> Informações:
> SO: Ubuntu Server, mas fiz um teste no Win e também tive o problema, acho
> que independe do SO.
> PostgreSQl: 8.3.5 compilado.
> Echema: Public
> Encodig UTF8
>
> Quando é executado o passo 4, alterando o tipo do campo, a ligação
> b.attrelid = a.relfilenode deixa de ser verdadeira, b.attrelid muda de
> valor. Assim o select passo 5 que é igual ao passo 3 não encontra mais o
> registro.
> Fiz algum teste de renomear a coluna e o mesmo não ocorre, aparentemente
> isso acontece apenas quando altero o tipo de dados. Obs. A mesma situação
> ocorre na versão 9.1.
> Não sei se é forma em que consulto o catálogo que está incorreta, e se
> alguém já passou por esse tipo de problema.
> Agradeço pela habitual cordialidade que sempre tive na lista.
>
> -- 1º
> CREATE DATABASE rteste
>   WITH OWNER = postgres
>        ENCODING = 'UTF8'
>        TABLESPACE = pg_default
>        CONNECTION LIMIT = -1;
>
> -- 2º
> CREATE TABLE tab_teste
> (
>   co_coluna numeric
> )
> WITH (
>   OIDS=FALSE
> );
> ALTER TABLE tab_teste OWNER TO postgres;
>
> -- 3º Encontra tabela e campo
> SELECT a.relname AS Tabela, b.attname AS Campo
> FROM pg_class a
> JOIN pg_attribute b ON  b.attrelid = a.relfilenode
> WHERE  a.relname = 'tab_teste' AND b.attname = 'co_coluna';
>
> -- 4º Provoca o problema
> ALTER TABLE tab_teste ALTER COLUMN co_coluna TYPE double precision;
>
> -- 5º Não encontra mais tabela e campo
> SELECT a.relname AS Tabela, b.attname AS Campo
> FROM pg_class a
> JOIN pg_attribute b ON  b.attrelid = a.relfilenode
> WHERE  a.relname = 'tab_teste' AND b.attname = 'co_coluna';
>

Na verdade sua consulta ao catalogo está incorreta, você deve usar oid de
pg_class que é o identificador da tabela com pg_attribute pelo attrelid.

SELECT a.relname AS Tabela, b.attname AS Campo
FROM pg_class a
JOIN pg_attribute b ON  b.attrelid = a.oid
WHERE  a.relname = 'tab_teste' AND b.attname = 'co_coluna';

Se você executar a consulta vai dar o resultado que você espera. O atributo
relfilenode refere-se ao arquivo físico no sitema de arquivos.


> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>

Abraços
-- 
JotaComm
http://jotacomm.wordpress.com
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a