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
