Re: Script para saber claves foraneas sobre una tabla

Lists: pgsql-es-ayuda
From: Javier Chávez B(dot) <jchavezb(at)gmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Script para saber claves foraneas sobre una tabla
Date: 2009-07-09 15:57:59
Message-ID: ded64bba0907090857m1d2f09c8o116055353e695ef2@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Estimados :

Existe alguna manera de saber mediante un script sobre las tablas de sistema
que tablas hacen referencia a una tabla, o sea saber donde el identificador
de una tabla en particular esta siendo utilizada como llave foranea por
otras...

Agradezco cualquier orientacion ..

Slds.
J.
--
Cumprimentos
jchavez
linux User #397972 on http://counter.li.org/

Eddie Izzard <http://www.brainyquote.com/quotes/authors/e/eddie_izzard.html>
- "Never put a sock in a toaster."


From: Ronald <ronaldriveros(at)gmail(dot)com>
To: Javier Chávez B(dot) <jchavezb(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Script para saber claves foraneas sobre una tabla
Date: 2009-07-09 16:18:38
Message-ID: 396a69b90907090918n6a91f97fp5636ea229769d217@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Necesitas obtener las DDL supongo, desde una aplicacion cliente hecha por ti
o tan desde un ide de bd?

El 9 de julio de 2009 11:57, Javier Chávez B. <jchavezb(at)gmail(dot)com> escribió:

> Estimados :
>
> Existe alguna manera de saber mediante un script sobre las tablas de
> sistema que tablas hacen referencia a una tabla, o sea saber donde el
> identificador de una tabla en particular esta siendo utilizada como llave
> foranea por otras...
>
> Agradezco cualquier orientacion ..
>
> Slds.
> J.
> --
> Cumprimentos
> jchavez
> linux User #397972 on http://counter.li.org/
>
> Eddie Izzard<http://www.brainyquote.com/quotes/authors/e/eddie_izzard.html> - "Never put a sock in a toaster."


From: Javier Chávez B(dot) <jchavezb(at)gmail(dot)com>
To: Ronald <ronaldriveros(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Script para saber claves foraneas sobre una tabla
Date: 2009-07-09 16:23:44
Message-ID: ded64bba0907090923k2f0f736cg236bbe29a0b7c910@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

2009/7/9 Ronald <ronaldriveros(at)gmail(dot)com>

> Necesitas obtener las DDL supongo, desde una aplicacion cliente hecha por
> ti o tan desde un ide de bd?
>
> El 9 de julio de 2009 11:57, Javier Chávez B. <jchavezb(at)gmail(dot)com>escribió:
>
> Estimados :
>>
>> Existe alguna manera de saber mediante un script sobre las tablas de
>> sistema que tablas hacen referencia a una tabla, o sea saber donde el
>> identificador de una tabla en particular esta siendo utilizada como llave
>> foranea por otras...
>>
>> Agradezco cualquier orientacion ..
>>
>> Slds.
>> J.
>>
>
O sea la idea es un select sobre las tablas de sitema donde le pase por
parametro un tabla / campo y me retorne que tablas le hacen referencia , me
entiendes? no necesito el DDL necesito saber quienes "estan apuntando a.. "
ya que necesito actualizar unas claves primarias por lo tanto tengo que
partir por saber que integridades debo cumplir, me queda el camino largo y
apestoso de abrir las tablas una por una en PGAdmin y ver las referencias
pero creo que debe haber una manera mas automatica de hacerlo .. el tema es
que no he dado con ello aun ...
Slds.

J.

--
Cumprimentos
jchavez
linux User #397972 on http://counter.li.org/

Clifford Stoll<http://www.brainyquote.com/quotes/authors/c/clifford_stoll.html>
- "The Internet is a telephone system that's gotten uppity."


From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Javier Chávez B(dot) <jchavezb(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Script para saber claves foraneas sobre una tabla
Date: 2009-07-09 17:00:15
Message-ID: 20090709170015.GE6414@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Javier Chávez B. escribió:
> Estimados :
>
> Existe alguna manera de saber mediante un script sobre las tablas de sistema
> que tablas hacen referencia a una tabla, o sea saber donde el identificador
> de una tabla en particular esta siendo utilizada como llave foranea por
> otras...

Por supuesto ... incluso es una nueva característica de psql en 8.4:

psql (8.4.0)
Digite «help» para obtener ayuda.

alvherre=# create table foo (a int primary key);
NOTICE: CREATE TABLE / PRIMARY KEY creará el índice implícito «foo_pkey» para l
a tabla «foo»
CREATE TABLE
alvherre=# create table bar (a int not null references foo);
CREATE TABLE

alvherre=# \d+ foo
********* QUERY **********
SELECT c.oid,
n.nspname,
c.relname
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relname ~ '^(foo)$'
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 2, 3;
**************************

********* QUERY **********
SELECT c.relchecks, c.relkind, c.relhasindex, c.relhasrules, c.relhastriggers, c.relhasoids, pg_catalog.array_to_string(c.reloptions || array(select 'toast.' || x from pg_catalog.unnest(tc.reloptions) x), ', ')
, c.reltablespace
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_class tc ON (c.reltoastrelid = tc.oid)
WHERE c.oid = '16395'

**************************

********* QUERY **********
SELECT a.attname,
pg_catalog.format_type(a.atttypid, a.atttypmod),
(SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)
FROM pg_catalog.pg_attrdef d
WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef),
a.attnotnull, a.attnum, a.attstorage, pg_catalog.col_description(a.attrelid, a.attnum)
FROM pg_catalog.pg_attribute a
WHERE a.attrelid = '16395' AND a.attnum > 0 AND NOT a.attisdropped
ORDER BY a.attnum
**************************

********* QUERY **********
SELECT c2.relname, i.indisprimary, i.indisunique, i.indisclustered, i.indisvalid, pg_catalog.pg_get_indexdef(i.indexrelid, 0, true), c2.reltablespace
FROM pg_catalog.pg_class c, pg_catalog.pg_class c2, pg_catalog.pg_index i
WHERE c.oid = '16395' AND c.oid = i.indrelid AND i.indexrelid = c2.oid
ORDER BY i.indisprimary DESC, i.indisunique DESC, c2.relname
**************************

********* QUERY **********
SELECT conname,
pg_catalog.pg_get_constraintdef(r.oid, true) as condef
FROM pg_catalog.pg_constraint r
WHERE r.conrelid = '16395' AND r.contype = 'f' ORDER BY 1
**************************

********* QUERY **********
SELECT conname, conrelid::pg_catalog.regclass,
pg_catalog.pg_get_constraintdef(c.oid, true) as condef
FROM pg_catalog.pg_constraint c
WHERE c.confrelid = '16395' AND c.contype = 'f' ORDER BY 1
**************************

********* QUERY **********
SELECT t.tgname, pg_catalog.pg_get_triggerdef(t.oid), t.tgenabled
FROM pg_catalog.pg_trigger t
WHERE t.tgrelid = '16395' AND t.tgconstraint = 0
ORDER BY 1
**************************

********* QUERY **********
SELECT c.oid::pg_catalog.regclass FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i WHERE c.oid=i.inhparent AND i.inhrelid = '16395' ORDER BY inhseqno
**************************

Tabla «public.foo»
Columna | Tipo | Modificadores | Almacenamiento | Descripción
---------+---------+---------------+----------------+-------------
a | integer | not null | plain |
Índices:
"foo_pkey" PRIMARY KEY, btree (a)
Referenciada por:
TABLE "bar" CONSTRAINT "bar_a_fkey" FOREIGN KEY (a) REFERENCES foo(a)
Tiene OIDs: no

--
Alvaro Herrera http://planet.postgresql.org/
"La gente vulgar sólo piensa en pasar el tiempo;
el que tiene talento, en aprovecharlo"


From: Julio Cesar Rodriguez Dominguez <jurasec(at)gmail(dot)com>
To: Javier Chávez B(dot) <jchavezb(at)gmail(dot)com>
Cc: Ronald <ronaldriveros(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Script para saber claves foraneas sobre una tabla
Date: 2009-07-09 17:03:44
Message-ID: 925902880907091003h2dcc9472n76fea08efb34fe98@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

El 9 de julio de 2009 11:23, Javier Chávez B.<jchavezb(at)gmail(dot)com> escribió:
>
>
> 2009/7/9 Ronald <ronaldriveros(at)gmail(dot)com>
>>
>> Necesitas obtener las DDL supongo, desde una aplicacion cliente hecha por
>> ti o tan desde un ide de bd?
>>
>> El 9 de julio de 2009 11:57, Javier Chávez B. <jchavezb(at)gmail(dot)com>
>> escribió:
>>>
>>> Estimados :
>>>
>>> Existe alguna manera de saber mediante un script sobre las tablas de
>>> sistema que tablas hacen referencia a una tabla, o sea saber donde el
>>> identificador de una tabla en particular esta siendo utilizada como llave
>>> foranea por otras...
>>>
>>> Agradezco cualquier orientacion ..
>>>
>>> Slds.
>>> J.
>
> O sea la idea es un select sobre las tablas de sitema donde le pase por
> parametro un tabla / campo  y me retorne que tablas le hacen referencia , me
> entiendes?  no necesito el DDL necesito saber quienes "estan apuntando a.. "
> ya que necesito actualizar unas claves primarias por lo tanto tengo que
> partir  por saber que integridades debo cumplir, me queda el camino largo y
> apestoso de abrir las tablas una por una en PGAdmin y ver las referencias
> pero creo que debe haber una manera mas automatica de hacerlo .. el tema es
> que no he dado con ello aun ...
> Slds.

Alvaro ya dio la solución, veamos si te sirve de todos modos:

SELECT (SELECT relname FROM pg_catalog.pg_class c LEFT JOIN
pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE
c.oid=r.conrelid) as nombre,conname,
pg_catalog.pg_get_constraintdef(oid, true) as condef from
pg_catalog.pg_constraint r WHERE r.conrelid in
( SELECT c.oid FROM pg_catalog.pg_class c LEFT JOIN
pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname !~
'pg_' and c.relkind = 'r' AND pg_catalog.pg_table_is_visible(c.oid))
AND r.contype = 'f' ;


From: Javier Chávez B(dot) <jchavezb(at)gmail(dot)com>
To: Julio Cesar Rodriguez Dominguez <jurasec(at)gmail(dot)com>
Cc: Ronald <ronaldriveros(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Script para saber claves foraneas sobre una tabla
Date: 2009-07-09 17:07:37
Message-ID: ded64bba0907091007g7e8c3bc4uff5e436169e8334c@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

2009/7/9 Julio Cesar Rodriguez Dominguez <jurasec(at)gmail(dot)com>

> El 9 de julio de 2009 11:23, Javier Chávez B.<jchavezb(at)gmail(dot)com>
> escribió:
> >
> >
> > 2009/7/9 Ronald <ronaldriveros(at)gmail(dot)com>
> >>
> >> Necesitas obtener las DDL supongo, desde una aplicacion cliente hecha
> por
> >> ti o tan desde un ide de bd?
> >>
> >> El 9 de julio de 2009 11:57, Javier Chávez B. <jchavezb(at)gmail(dot)com>
> >> escribió:
> >>>
> >>> Estimados :
> >>>
> >>> Existe alguna manera de saber mediante un script sobre las tablas de
> >>> sistema que tablas hacen referencia a una tabla, o sea saber donde el
> >>> identificador de una tabla en particular esta siendo utilizada como
> llave
> >>> foranea por otras...
> >>>
> >>> Agradezco cualquier orientacion ..
> >>>
> >>> Slds.
> >>> J.
> >
> > O sea la idea es un select sobre las tablas de sitema donde le pase por
> > parametro un tabla / campo y me retorne que tablas le hacen referencia ,
> me
> > entiendes? no necesito el DDL necesito saber quienes "estan apuntando
> a.. "
> > ya que necesito actualizar unas claves primarias por lo tanto tengo que
> > partir por saber que integridades debo cumplir, me queda el camino largo
> y
> > apestoso de abrir las tablas una por una en PGAdmin y ver las referencias
> > pero creo que debe haber una manera mas automatica de hacerlo .. el tema
> es
> > que no he dado con ello aun ...
> > Slds.
>
> Alvaro ya dio la solución, veamos si te sirve de todos modos:
>
> SELECT (SELECT relname FROM pg_catalog.pg_class c LEFT JOIN
> pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE
> c.oid=r.conrelid) as nombre,conname,
> pg_catalog.pg_get_constraintdef(oid, true) as condef from
> pg_catalog.pg_constraint r WHERE r.conrelid in
> ( SELECT c.oid FROM pg_catalog.pg_class c LEFT JOIN
> pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname !~
> 'pg_' and c.relkind = 'r' AND pg_catalog.pg_table_is_visible(c.oid))
> AND r.contype = 'f' ;
>

Una vez mas GRACIAS TOTALES!!! :0)

Alvaro: Aun no uso PG 8.4 :0( pero buen dato, pasa a la wiki de la empresa
:0)

--
Cumprimentos
jchavez
linux User #397972 on http://counter.li.org/

Luis Bunuel <http://www.brainyquote.com/quotes/authors/l/luis_bunuel.html>
- "Age is something that doesn't matter, unless you are a cheese."


From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Javier Chávez B(dot) <jchavezb(at)gmail(dot)com>
Cc: Julio Cesar Rodriguez Dominguez <jurasec(at)gmail(dot)com>, Ronald <ronaldriveros(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Script para saber claves foraneas sobre una tabla
Date: 2009-07-09 17:12:20
Message-ID: 20090709171220.GH6414@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Javier Chávez B. escribió:

> Alvaro: Aun no uso PG 8.4 :0( pero buen dato, pasa a la wiki de la empresa
> :0)

Eso no importa, yo te estaba mostrando las consultas que psql hace, que
deberían ser compatibles con versiones anteriores.

(Oh, a todo esto, olvidé mencionar que a partir de 8.4, psql es capaz de
conectarse a servidores de versiones anteriores y funcionar
correctamente con ellos)

--
Alvaro Herrera http://www.amazon.com/gp/registry/5ZYLFMCVHXC
"La Primavera ha venido. Nadie sabe como ha sido" (A. Machado)


From: Javier Chávez B(dot) <jchavezb(at)gmail(dot)com>
To: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
Cc: Julio Cesar Rodriguez Dominguez <jurasec(at)gmail(dot)com>, Ronald <ronaldriveros(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Script para saber claves foraneas sobre una tabla
Date: 2009-07-09 17:18:47
Message-ID: ded64bba0907091018w42ea2fa2kd3b3e62bcb94ad04@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

2009/7/9 Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>

> Javier Chávez B. escribió:
>
> > Alvaro: Aun no uso PG 8.4 :0( pero buen dato, pasa a la wiki de la
> empresa
> > :0)
>
> Eso no importa, yo te estaba mostrando las consultas que psql hace, que
> deberían ser compatibles con versiones anteriores.

Ok .. me referia a la parte Help

(Oh, a todo esto, olvidé mencionar que a partir de 8.4, psql es capaz de
> conectarse a servidores de versiones anteriores y funcionar
> correctamente con ellos)
>
>
Pregunta dentro de este mismo contexto .. existe algun lugar donde este la
definicion de las tablas de sistema para saber que contienen y sus
relaciones? Porque vi sus querys y me gustaria entenderlas un poco mas... O
veo en la documentacion y ya...?

Slds.
J.

--
Cumprimentos
jchavez
linux User #397972 on http://counter.li.org/

Eddie Izzard <http://www.brainyquote.com/quotes/authors/e/eddie_izzard.html>
- "Never put a sock in a toaster."


From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Javier Chávez B(dot) <jchavezb(at)gmail(dot)com>
Cc: Julio Cesar Rodriguez Dominguez <jurasec(at)gmail(dot)com>, Ronald <ronaldriveros(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Script para saber claves foraneas sobre una tabla
Date: 2009-07-09 17:25:35
Message-ID: 20090709172535.GI6414@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Javier Chávez B. escribió:

> Pregunta dentro de este mismo contexto .. existe algun lugar donde este la
> definicion de las tablas de sistema para saber que contienen y sus
> relaciones? Porque vi sus querys y me gustaria entenderlas un poco mas... O
> veo en la documentacion y ya...?

En la documentación está la definición de los catálogos, pero para
llegar a desarrollar buenas consultas necesitas entenderlos bien. Por
eso suele ser más sencillo usar psql -E y ver qué consultas usa; así te
familiarizas con los detalles. Si lo usas harto, al final deberías
entender los catálogos (y las funciones necesarias) lo suficientemente
bien como para poder hacer las consultas tú mismo.

--
Alvaro Herrera Valdivia, Chile ICBM: S 39º 48' 55.3", W 73º 15' 24.7"
"La victoria es para quien se atreve a estar solo"


From: Javier Chávez B(dot) <jchavezb(at)gmail(dot)com>
To: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
Cc: Julio Cesar Rodriguez Dominguez <jurasec(at)gmail(dot)com>, Ronald <ronaldriveros(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Script para saber claves foraneas sobre una tabla
Date: 2009-07-09 17:28:01
Message-ID: ded64bba0907091028o595cb0c9p7e9a04d4b6954acc@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

2009/7/9 Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>

> Javier Chávez B. escribió:
>
> > Pregunta dentro de este mismo contexto .. existe algun lugar donde este
> la
> > definicion de las tablas de sistema para saber que contienen y sus
> > relaciones? Porque vi sus querys y me gustaria entenderlas un poco
> mas... O
> > veo en la documentacion y ya...?
>
> En la documentación está la definición de los catálogos, pero para
> llegar a desarrollar buenas consultas necesitas entenderlos bien. Por
> eso suele ser más sencillo usar psql -E y ver qué consultas usa; así te
> familiarizas con los detalles. Si lo usas harto, al final deberías
> entender los catálogos (y las funciones necesarias) lo suficientemente
> bien como para poder hacer las consultas tú mismo.
>
> Ok ! gracias es que en SqlServer ya tenia cierta familiaridad con ello y
ahora que estoy mas metido en PG voy descubriendo cada vez se hace mas
necesario, porque tente de hacer las consultas basandome en otras pero como
no conozco como estan las relaciones estaba dando palos de ciego...

Slds.
J

--
Cumprimentos
jchavez
linux User #397972 on http://counter.li.org/

Luis Bunuel <http://www.brainyquote.com/quotes/authors/l/luis_bunuel.html>
- "Age is something that doesn't matter, unless you are a cheese."


From: Julio Cesar Rodriguez Dominguez <jurasec(at)gmail(dot)com>
To: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
Cc: Javier Chávez B(dot) <jchavezb(at)gmail(dot)com>, Ronald <ronaldriveros(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Script para saber claves foraneas sobre una tabla
Date: 2009-07-09 17:28:05
Message-ID: 925902880907091028t58da5982y988d59dc63734661@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

El 9 de julio de 2009 12:25, Alvaro Herrera<alvherre(at)alvh(dot)no-ip(dot)org> escribió:
> Javier Chávez B. escribió:
>
>> Pregunta dentro de este mismo contexto .. existe algun lugar donde este la
>> definicion de las tablas de sistema para saber que contienen y sus
>> relaciones?  Porque vi sus querys y me gustaria entenderlas un poco mas... O
>> veo en la documentacion y ya...?
>
> En la documentación está la definición de los catálogos, pero para
> llegar a desarrollar buenas consultas necesitas entenderlos bien.  Por
> eso suele ser más sencillo usar psql -E y ver qué consultas usa; así te
> familiarizas con los detalles.  Si lo usas harto, al final deberías
> entender los catálogos (y las funciones necesarias) lo suficientemente
> bien como para poder hacer las consultas tú mismo.

Efectivamente, yo utilizé psql -E para guiarme, puedes darle una leida
a esto tambien:
http://www.postgresql.org/docs/current/static/catalogs-overview.html