Saudações, Uma coisa que sempre senti muita falta foi o fato de o editor de Query do pgAdmin não mostrar a estrutura de uma tabela/view facilmente. Sempre tinha que mudar de tela e procurar pela tabela que quero. Isso leva algum tempo, principalmente quando estou codificando alguma SP. Alguns programas trazem com uma simples tecla de atalho a estrutura da uma tabela que estiver selecionada.
Recentemente resolvi criar uma macro no pgAdmin para tentar suprir esse falta que senti. Conclui hoje a macro e resolvi compartilhar com vocês, quem sabe alguém esteja sentindo a mesma necessidade. Ainda falta algumas informações, mas já dá para usar! Para utilizar, crie uma macro com o código abaixo. Para executar, basta selecionar a tabela/view que deseja e teclar o atalho selecionado para a macro. Fiz a macro na versão 7.4, mas creio que vá funcionar em outras versões. Tem algumas "adaptações técnicas" como enviar um exception no final para não sair da tela de mensagens. Sugestões são muito bem vindas. Caso alguem queira compartilhar suas macros, acho que será bem proveitoso! Segue o código: CREATE OR REPLACE FUNCTION sp_xyz_desc_tabela_view(varchar) RETURNS void AS 'DECLARE prTabela ALIAS FOR $1; rec RECORD; sSQL TEXT; s TEXT; BEGIN sSQL := ''SELECT b.attname AS campo, c.typname AS tipo, (CASE b.attlen When -1 then (b.atttypmod - 4) else b.attlen end)::varchar as digitos, (CASE b.attnotnull When '' || quote_literal(''t'') || '' Then '' || quote_literal(''S'') || '' Else '' || quote_literal(''N'') || '' END) AS nulo, (CASE b.atthasdef When '' || quote_literal(''t'') || '' Then '' || quote_literal(''S'') || '' Else '' || quote_literal(''N'') || '' END) AS default FROM pg_class a JOIN pg_attribute b ON (b.attrelid = a.relfilenode) JOIN pg_type c ON (c.typelem = b.atttypid AND c.typlen = -1) WHERE b.attstattarget = -1 AND a.relname = '' || quote_literal(prTabela) || '' ORDER BY b.attnum''; s := ''\n*** ATRIBUTOS\n Nome'' || lpad('' '', 26) || ''Campo'' || lpad('' '', 10) || ''TAMANHO NULO DEFAULT''; FOR rec IN EXECUTE sSQL LOOP s := s || ''\n '' || rec.campo || lpad('' '', 30 - length(rec.campo)) || rec.tipo || lpad('' '', 15 - length(rec.tipo)) || rec.digitos || lpad('' '', 10 - length(rec.digitos)) || rec.nulo || lpad('' '', 6 - length(rec.nulo)) || rec.default || lpad('' '', 3 - length(rec.default)); END LOOP; --raise notice ''%'',s; s := s || ''\n\n *** CHAVES PRIMARIAS''; sSQL := ''SELECT b.relname FROM pg_catalog.pg_index a LEFT JOIN pg_class b ON (b.relfilenode = a.indexrelid) LEFT JOIN pg_class c ON (a.indrelid = c.relfilenode) WHERE c.relname = '' || quote_literal(prTabela) || '' AND a.indisprimary = '' || quote_literal(''t''); FOR rec IN EXECUTE sSQL LOOP s := s || ''\n '' || rec.relname; END LOOP; s := s || ''\n\n *** RESTRICOES DE UNICIDADE''; sSQL := ''SELECT b.relname FROM pg_catalog.pg_index a LEFT JOIN pg_class b ON (b.relfilenode = a.indexrelid) LEFT JOIN pg_class c ON (a.indrelid = c.relfilenode) WHERE c.relname = '' || quote_literal(prTabela) || '' AND a.indisprimary = '' || quote_literal(''f'') || '' AND a.indisunique = '' || quote_literal(''t''); FOR rec IN EXECUTE sSQL LOOP s := s || ''\n '' || rec.relname; END LOOP; s := s || ''\n\n *** INDICES''; sSQL := ''SELECT b.relname FROM pg_catalog.pg_index a LEFT JOIN pg_class b ON (b.relfilenode = a.indexrelid) LEFT JOIN pg_class c ON (a.indrelid = c.relfilenode) WHERE c.relname = '' || quote_literal(prTabela) || '' AND a.indisprimary = '' || quote_literal(''f'') || '' AND a.indisunique = '' || quote_literal(''f''); FOR rec IN EXECUTE sSQL LOOP s := s || ''\n '' || rec.relname; END LOOP; s := s || ''\n\n *** RESTRIÇÕES''; sSQL := ''SELECT a.conname, a.consrc FROM pg_catalog.pg_constraint a LEFT JOIN pg_class b ON (a.conrelid = b.relfilenode) WHERE contype = '' || quote_literal(''c'') || '' AND b.relname = '' || quote_literal(prTabela); FOR rec IN EXECUTE sSQL LOOP s := s || ''\n '' || rec.conname || lpad('' '', 30 - length(rec.conname)) || rec.consrc; END LOOP; s := s || ''\n\n *** RELACIONAMENTOS''; sSQL := ''SELECT a.conname FROM pg_catalog.pg_constraint a LEFT JOIN pg_class b ON (a.conrelid = b.relfilenode) WHERE contype = '' || quote_literal(''f'') || '' AND b.relname = '' || quote_literal(prTabela); FOR rec IN EXECUTE sSQL LOOP s := s || ''\n '' || rec.conname; END LOOP; raise notice ''% \n\n\n\n\n\n .'',s; sSQL := ''DROP FUNCTION sp_xyz_desc_tabela_view(varchar)''; EXECUTE sSQL; RAISE EXCEPTION '' ''; END; ' LANGUAGE 'plpgsql' VOLATILE; SELECT sp_xyz_desc_tabela_view('$SELECTION$'); Att Evandro _______________________________________________ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral