Discussion:
Listar quais constraints / tabelas estão referenciando uma tabela específica
Bruno Silva
2012-07-20 00:29:18 UTC
Permalink
No psql \dt schema.tabela
Boa noite pessoALL.
Estou com a seguinte necessidade: eu preciso descobrir quais são as
constraints de foreign-key
que estão fazendo referencia à tabelaX(colunaPK) ?
Meu banco de dados contém vários schemas e cada um, muitas tabelas.
Então, por meio de
pgadmin, está meio desumano "entrar" em cada schema e observar cada
tabela verificando
schemaX.tabelaX(colunaPk).
Bom, o psql já traz isso, o pgAdmin não??
Daí, penso que consultar o catálogo ou algumas sysTables para "querar"
essa informação, é
algo mais racional / viável.
Alguém sabe que "querie" eu poderia aplicar no banco para obter essa
informação ?
SELECT conname, conrelid::pg_catalog.regclass,
pg_catalog.pg_get_constraintdef(c.oid, true) as condef
FROM pg_catalog.pg_constraint c
JOIN pg_catalog.pg_class r ON r.oid = c.confrelid
JOIN pg_catalog.pg_namespace n ON n.oid = r.relnamespace
WHERE r.relname = '*<nome tabela>*' AND n.nspname = '*<nome schema>*' AND
c.contype = 'f'
ORDER BY 1
Atenciosamente,
--
Matheus de Oliveira
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Bruno Silva
2012-07-20 00:30:03 UTC
Permalink
ou \d+ schema.tabela
Post by Bruno Silva
No psql \dt schema.tabela
Boa noite pessoALL.
Estou com a seguinte necessidade: eu preciso descobrir quais são as
constraints de foreign-key
que estão fazendo referencia à tabelaX(colunaPK) ?
Meu banco de dados contém vários schemas e cada um, muitas tabelas.
Então, por meio de
pgadmin, está meio desumano "entrar" em cada schema e observar cada
tabela verificando
schemaX.tabelaX(colunaPk).
Bom, o psql já traz isso, o pgAdmin não??
Daí, penso que consultar o catálogo ou algumas sysTables para "querar"
essa informação, é
algo mais racional / viável.
Alguém sabe que "querie" eu poderia aplicar no banco para obter essa
informação ?
SELECT conname, conrelid::pg_catalog.regclass,
pg_catalog.pg_get_constraintdef(c.oid, true) as condef
FROM pg_catalog.pg_constraint c
JOIN pg_catalog.pg_class r ON r.oid = c.confrelid
JOIN pg_catalog.pg_namespace n ON n.oid = r.relnamespace
WHERE r.relname = '*<nome tabela>*' AND n.nspname = '*<nome schema>*'
AND c.contype = 'f'
ORDER BY 1
Atenciosamente,
--
Matheus de Oliveira
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Marcos Aurelio Nobre
2012-07-20 00:50:11 UTC
Permalink
Bruno, boa noite.

Isso ai que vc postou não resolve a minha questão - não.
O \dt schema. lista as tabelas (relations) contidas no schema.
Se enviarmos \dt schema.tabela somente esta <tabela> (relação) será
listada

Será que vc não confundiu a palavra "relations" com a idéia de "as relações
que uma tabela contém" ?

Em verdade, no jargão de Banco de Dados Relacional (em inglês) "relations"
refere-se às "tabelas" do
banco de dados.

Se fosse no jargão da Álgebra Relacional, ouviríamos a palavra "Tupla"
referindo-se ao que conhecemos
como tabelas do banco de dados.

O fato é que o \DT não lista as constraints de foreign-key que uma certa
tabela recebe em sua PK - não mesmo.

MN
Post by Bruno Silva
No psql \dt schema.tabela
Boa noite pessoALL.
Estou com a seguinte necessidade: eu preciso descobrir quais são as
constraints de foreign-key
que estão fazendo referencia à tabelaX(colunaPK) ?
Meu banco de dados contém vários schemas e cada um, muitas tabelas.
Então, por meio de
pgadmin, está meio desumano "entrar" em cada schema e observar cada
tabela verificando
schemaX.tabelaX(colunaPk).
Bom, o psql já traz isso, o pgAdmin não??
Daí, penso que consultar o catálogo ou algumas sysTables para "querar"
essa informação, é
algo mais racional / viável.
Alguém sabe que "querie" eu poderia aplicar no banco para obter essa
informação ?
SELECT conname, conrelid::pg_catalog.regclass,
pg_catalog.pg_get_constraintdef(c.oid, true) as condef
FROM pg_catalog.pg_constraint c
JOIN pg_catalog.pg_class r ON r.oid = c.confrelid
JOIN pg_catalog.pg_namespace n ON n.oid = r.relnamespace
WHERE r.relname = '*<nome tabela>*' AND n.nspname = '*<nome schema>*'
AND c.contype = 'f'
ORDER BY 1
Atenciosamente,
--
Matheus de Oliveira
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Guimarães Faria Corcete DUTRA, Leandro
2012-07-20 01:00:09 UTC
Permalink
Post by Marcos Aurelio Nobre
Se fosse no jargão da Álgebra Relacional, ouviríamos a palavra "Tupla"
referindo-se ao que conhecemos
como tabelas do banco de dados.
Errado!
Fabrízio de Royes Mello
2012-07-20 02:34:22 UTC
Permalink
Em 19 de julho de 2012 21:50, Marcos Aurelio Nobre
Post by Marcos Aurelio Nobre
[...]
Se fosse no jargão da Álgebra Relacional, ouviríamos a palavra "Tupla"
referindo-se ao que conhecemos
como tabelas do banco de dados.
[...]
Vc quis dizer "Linha ou Registro" né... pq uma tabela é tb conhecida como
"relação" na álgebra relacional [1].

[1] http://pt.wikipedia.org/wiki/%C3%81lgebra_relacional
--
Fabrízio de Royes Mello
Consultoria/Coaching PostgreSQL
Post by Marcos Aurelio Nobre
Blog sobre TI: http://fabriziomello.blogspot.com
Perfil Linkedin: http://br.linkedin.com/in/fabriziomello
Twitter: http://twitter.com/fabriziomello
Marcos Aurelio Nobre
2012-07-20 17:56:34 UTC
Permalink
Ok, é isso mesmo.
O Leandro (que me corrigiu primeiro) e vc têm razão.
Gratos.

MN

Em 19 de julho de 2012 23:34, Fabrízio de Royes Mello <
Post by Fabrízio de Royes Mello
Post by Marcos Aurelio Nobre
[...]
Se fosse no jargão da Álgebra Relacional, ouviríamos a palavra "Tupla"
referindo-se ao que conhecemos
como tabelas do banco de dados.
[...]
Vc quis dizer "Linha ou Registro" né... pq uma tabela é tb conhecida como
"relação" na álgebra relacional [1].
[1] http://pt.wikipedia.org/wiki/%C3%81lgebra_relacional
--
Fabrízio de Royes Mello
Consultoria/Coaching PostgreSQL
Post by Marcos Aurelio Nobre
Blog sobre TI: http://fabriziomello.blogspot.com
Perfil Linkedin: http://br.linkedin.com/in/fabriziomello
Twitter: http://twitter.com/fabriziomello
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Bruno Silva
2012-07-20 18:18:36 UTC
Permalink
Bem, no seu email você disse que precisava saber as foreign keys que
apontavam para aquela tabela. O que entendi foi, "quero saber quem está
usando a pk da tabela A como chave estrangeira"
Então o parâmetro, em minúsculos, \d+ <schema>.<tabela> exibe todos os
relacionamentos. Ex.: \d+ financeiro.contas
Concordo que sim ele exibirá mais informações além dos relacionamentos, mas
para o que você está querendo que é documentar, o mais indicado seria usar
o postgresql_autodoc[1], com dicas nesse link[2]

[1] http://www.rbt.ca/autodoc/
[2]
http://www.beyondtechnicallycorrect.com/2011/01/18/generating-postgresql-database-diagrams-with-postgresql_autodoc/

Bruno E. A. Silva.
Analista de Sistemas.
Ok, é isso mesmo.
O Leandro (que me corrigiu primeiro) e vc têm razão.
Gratos.
MN
Em 19 de julho de 2012 23:34, Fabrízio de Royes Mello <
[...]
Se fosse no jargão da Álgebra Relacional, ouviríamos a palavra "Tupla"
referindo-se ao que conhecemos
como tabelas do banco de dados.
[...]
Vc quis dizer "Linha ou Registro" né... pq uma tabela é tb conhecida como
"relação" na álgebra relacional [1].
[1] http://pt.wikipedia.org/wiki/%C3%81lgebra_relacional
--
Fabrízio de Royes Mello
Consultoria/Coaching PostgreSQL
Blog sobre TI: http://fabriziomello.blogspot.com
Perfil Linkedin: http://br.linkedin.com/in/fabriziomello
Twitter: http://twitter.com/fabriziomello
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Marcos Aurelio Nobre
2012-07-20 00:54:52 UTC
Permalink
Bruno,

Ok, o \D+ schema.tabela lista o que preciso mas tbm muita informação que
não preciso.

O SELECT no catalogo (aka system-tables) que o Matheus postou é mais direto
e preciso.

De toda sorte , muito grato pela ajuda e diligência.

MN
Post by Bruno Silva
ou \d+ schema.tabela
No psql \dt schema.tabela
Boa noite pessoALL.
Estou com a seguinte necessidade: eu preciso descobrir quais são as
constraints de foreign-key
que estão fazendo referencia à tabelaX(colunaPK) ?
Meu banco de dados contém vários schemas e cada um, muitas tabelas.
Então, por meio de
pgadmin, está meio desumano "entrar" em cada schema e observar cada
tabela verificando
schemaX.tabelaX(colunaPk).
Bom, o psql já traz isso, o pgAdmin não??
Daí, penso que consultar o catálogo ou algumas sysTables para "querar"
essa informação, é
algo mais racional / viável.
Alguém sabe que "querie" eu poderia aplicar no banco para obter essa
informação ?
SELECT conname, conrelid::pg_catalog.regclass,
pg_catalog.pg_get_constraintdef(c.oid, true) as condef
FROM pg_catalog.pg_constraint c
JOIN pg_catalog.pg_class r ON r.oid = c.confrelid
JOIN pg_catalog.pg_namespace n ON n.oid = r.relnamespace
WHERE r.relname = '*<nome tabela>*' AND n.nspname = '*<nome schema>*'
AND c.contype = 'f'
ORDER BY 1
Atenciosamente,
--
Matheus de Oliveira
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Matheus de Oliveira
2012-07-20 18:17:54 UTC
Permalink
BINGO !
Esse SELECT mata-a-pau o que preciso !
Valeu Matheus, é exatamente isso.
Sussa...
Aproveitando......
Como eu acredito que no PostgreSQL não há como "desativar" uma
FK-constraint então se eu quisesse deletar as constraints que são listadas
PG_CATALOG.PG_CONSTRAINT ?
Nunca... Jamais... Em hipótese alguma... Execute UPDATE, DELETE ou INSERT
nas tabelas de catálogo do PostgreSQL, isso pode ser desastroso e é um
pecado mortal (ao menos que você esteja "debugando" algo, sob o risco de
corromper o catálogo).

Mas, se você realmente precisa excluir FOREIGN KEYS em batch, eu
recomendaria um shell script ou uma função PL/pgSQL (com o comando
EXECUTE), assim você pode gerar o script para "recriar" antes de excluir,
veja que a definição da FOREIGN KEY é recuperada com a função
pg_get_constraintdef, daí é só concaternar o ALTER TABLE.

Exemplo (não sei se funfa com certeza, feito de cabeça), função com RETURNS
SETOF TEXT que remove e retorna o script pra recriar:

FOR v_cons, v_rel, v_def IN
SELECT conname, conrelid::pg_catalog.regclass,
pg_catalog.pg_get_constraintdef(c.oid, true) as condef
FROM pg_catalog.pg_constraint c
JOIN pg_catalog.pg_class r ON r.oid = c.confrelid
JOIN pg_catalog.pg_namespace n ON n.oid = r.relnamespace
WHERE r.relname = '*<nome tabela>*' AND n.nspname = '*<nome schema>*' AND
c.contype = 'f'
ORDER BY 1
LOOP
EXECUTE 'ALTER TABLE ' || v_rel || ' DROP CONSTRAINT ' || v_cons;
RETURN NEXT 'ALTER TABLE ' || v_rel || ' ADD CONSTRAINT ' || v_cons ||
' ' || v_def || ';';
END LOOP;

ou \d+ schema.tabela
Fato: retirei essa query do próprio comando \d+ do psql (invocado com -E),
fica a dica...

Atenciosamente,
--
Matheus de Oliveira
Loading...