Jorge lo que me faltó fue agregar el atributo local,creo, bueno para esto hago un ´parsel´ de la definición del constrait nuevamente para obtener el atributo local relacionado con la llave foránea, aquí te va +- lo que logré:

SELECT pg_constraint.conname as nombrellave ,  pg_class.relname AS tabla,
substring(
pg_get_constraintdef(pg_constraint.oid) from position ('(' in pg_get_constraintdef(pg_constraint.oid) ) for position (')' in pg_get_constraintdef(pg_constraint.oid) ) -position ('(' in pg_get_constraintdef(pg_constraint.oid) )+1 ) as atributolocal,

substring ( pg_get_constraintdef(pg_constraint.oid) from (position ((select a.relname from pg_class a where a.oid=pg_constraint.confrelid) in pg_get_constraintdef(pg_constraint.oid))) for position(' ON ' in pg_get_constraintdef(pg_constraint.oid))-position ((select a.relname from pg_class a where a.oid=pg_constraint.confrelid) in pg_get_constraintdef(pg_constraint.oid)) ) as atributoforaneo, (select nspname||'.'||relname from pg_class, pg_namespace where relnamespace=pg_namespace.oid and pg_class.oid = pg_constraint.confrelid and relkind='r' ) as esquemaytablaforanea
,
case confmatchtype
      when 'u' then 'MATCH simple '
      when 'f' then 'MATCH full'
      when 'p' then 'MATCH partial'
      end as tipo,
      case confupdtype
       when 'a' then 'no action '
      when 'r' then 'restrict'
      when 'c' then 'cascade'
      when 'n' then 'set null'
      else
      'default'

      end as onupdate ,
      case confdeltype
       when 'a' then 'no action '
      when 'r' then 'restrict'
      when 'c' then 'cascade'
      when 'n' then 'set null'
      else
      'default'

      end as ondelete
FROM pg_constraint, pg_class
WHERE ( (pg_constraint.contype = 'f'::"char") AND (pg_constraint.conrelid =
    pg_class.oid) and relname='nombretutabla')


saludos


El 1/26/2014 12:49 PM, Jorge Alberto Aquino Andrade escribió:
Disculpa Anthony, ya vi que que lo que tiene que devolver son las relaciones foraneas que tiene la tabla que se le define en nombretutaba, yo esperaba que me diera como resultado tal como lo habia planteado inicialmente de saber el atributo local que esta relacionado con el foraneo, en lo que me enviaste solo esta el atributo foraneo, aunque creo que solo lo combinare con lo que yo tengo y creo que va funcionar, te cuento luego el resultado, muchas gracias por compartir tu conocimiento.


2014-01-26 Jorge Alberto Aquino Andrade <[email protected] <mailto:[email protected]>>

    Hola Anthony, fijate que al ejecutar el SQL no me devuelve datos


    2014-01-25 Anthony Rafael Sotolongo León <[email protected]
    <mailto:[email protected]>>

        Hola Jorge espero que esto te sirva, solo debes sustituir al
        final de la consulta 'nombretutaba' por  nombre de tu tabla:

        SELECT pg_constraint.conname as nombrellave , pg_class.relname
        AS tabla,

substring ( pg_get_constraintdef(pg_constraint.oid) from (position ((select a.relname from pg_class a where
        a.oid=pg_constraint.confrelid) in
        pg_get_constraintdef(pg_constraint.oid))) for position(' ON '
        in pg_get_constraintdef(pg_constraint.oid))-position ((select
        a.relname from pg_class a where a.oid=pg_constraint.confrelid)
        in pg_get_constraintdef(pg_constraint.oid)) ) as atributoforaneo,
(select nspname||'.'||relname from pg_class, pg_namespace where relnamespace=pg_namespace.oid and pg_class.oid =
        pg_constraint.confrelid and relkind='r' ) as esquemaytablaforanea
        ,
        case confmatchtype
              when 'u' then 'MATCH simple '
              when 'f' then 'MATCH full'
              when 'p' then 'MATCH partial'
              end as tipo,
              case confupdtype
               when 'a' then 'no action '
              when 'r' then 'restrict'
              when 'c' then 'cascade'
              when 'n' then 'set null'
              else
              'default'

              end as onupdate ,
              case confdeltype
               when 'a' then 'no action '
              when 'r' then 'restrict'
              when 'c' then 'cascade'
              when 'n' then 'set null'
              else
              'default'

              end as ondelete
        FROM pg_constraint, pg_class
        WHERE (   (pg_constraint.contype = 'f'::"char") AND
        (pg_constraint.conrelid =
            pg_class.oid) and relname='nombretutaba')



        saludos


        El 1/25/2014 11:29 AM, Jorge Alberto Aquino Andrade escribió:
        Lista por favor ayudenme, necesito saber donde obtengo en la
        base cual es el campo de una llave foranea es decir si tengo esto

        CONSTRAINT nombre_constraint FOREIGN KEY (atributo1)
              REFERENCES esquema.tabla2 (atributo2) MATCH SIMPLE
              ON UPDATE RESTRICT ON DELETE RESTRICT

        como saber que el atributo1 esta reealacionado con el
        atributo2 obteniendo nombre de esquemas y tablas respectivos.

        Nota:
        Hasta el momento he logrado recurperar todos los atributos de
        las tablas foraneas que estan ligadas con la tabla primaria
        pero yo solo deseo el atributo de la tabla foranea que esta
        ligado con la tabla primaria.


        ------------------------------------------------------------------------

        III Escuela Internacional de Invierno en la UCI del 17 al 28
        de febrero del 2014. Ver www.uci.cu <http://www.uci.cu/>






________________________________________________________________________________________________
III Escuela Internacional de Invierno en la UCI del 17 al 28 de febrero del 
2014. Ver www.uci.cu

Responder a