Skip site navigation (1) Skip section navigation (2)

Re: Catalogos postgres

From: Marcelo Fernández <fernandezm22(at)yahoo(dot)com(dot)ar>
To: Danier Marante Jacas <djacas(at)estudiantes(dot)uci(dot)cu>
Cc: pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Catalogos postgres
Date: 2008-10-12 19:59:19
Message-ID: 48F25717.9020204@yahoo.com.ar (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
Danier Marante Jacas escribió:
>  Hola amigos. 
>  Necesito saber los schemas de mi db, para ello consulte a los catálogos de postres pero no he encontrado ninguna catálogos que sea específicamente para los schemas. No se si me explico bien, 
> la solución que yo he encontrado es usando el catalogo de las tablas  seria así. 
>  
> select pg_tables.schemaname  from pg_tables
> where pg_tables.schemaname not
> in('pg_catalog','information_schema')
> group by pg_tables.schemaname 
>  
> con esto resuelvo el problema, pero me gustaría saber si hay algún catalogo que sea para los schema
> como pg_schema o algo parecido.
>  
>  Gracias de antemano.
> 
> 
> --
> TIP 4: No hagas 'kill -9' a postmaster
> 


Hola Danier!

Sinceramente me puse a buscar por alguna tabla en el catálogo, o alguna 
manera más sencilla de la que planteaste y no encontré nada. Sin 
embargo, se me ocurrió buscar en el código fuente del psql, ya que tiene 
el comando '\dn', y filtré (entre el código C [1]) esto:

SELECT n.nspname AS "Name",
        r.rolname AS "Owner",
        n.nspacl as "Access privileges",
        pg_catalog.obj_description(n.oid, 'pg_namespace') as "Description"
FROM pg_catalog.pg_namespace n JOIN pg_catalog.pg_roles r
      ON n.nspowner=r.oid
WHERE (n.nspname !~ '^pg_temp_' OR
        n.nspname = (pg_catalog.current_schemas(true))[1])
ORDER BY 1;

En principio, entiendo que el prefijo 'nsp' responde a 'Namespace', 
concepto similar al de Schema. Luego me tomo el trabajo de analizar el 
query, y me encuentro conque en la tabla 'pg_namespace' del catálogo 
tenés todo lo que necesitás:

test=# select * from pg_catalog.pg_namespace;
       nspname       | nspowner |               nspacl
--------------------+----------+-------------------------------------
  pg_catalog         |       10 | {postgres=UC/postgres,=U/postgres}
  pg_toast           |       10 |
  public             |       10 | {postgres=UC/postgres,=UC/postgres}
  pg_temp_1          |       10 |
  pg_toast_temp_1    |       10 |
  information_schema |       10 | {postgres=UC/postgres,=U/postgres}
(6 filas)

Las únicas cosas 'extra' que hace el query del psql es:

- Eliminar todos los schemas que comiencen con 'pg_temp' (seguramente 
porque son de uso interno de Postgres).
- Hacer un join contra la tabla de roles para obtener el nombre del 
owner de cada schema.

Por último, buscando en la documentación de PostgreSQL, encuentro esto:

http://www.postgresql.org/docs/8.3/interactive/catalog-pg-namespace.html

"The catalog pg_namespace stores namespaces. A namespace is the 
structure underlying SQL schemas: each namespace can have a separate 
collection of relations, types, etc. without name conflicts."

En resumen, para lo que vos necesitás (ver todos los esquemas de una 
base de datos), y siguiendo este camino, haría un:

test=# SELECT * FROM pg_catalog.pg_namespace nsp
test-# WHERE (nsp.nspname !~ '^pg_temp_|^pg_toast') AND
test-# (nsp.nspname NOT IN ('pg_catalog', 'information_schema'));
  nspname | nspowner |               nspacl
---------+----------+-------------------------------------
  public  |       10 | {postgres=UC/postgres,=UC/postgres}
(1 fila)


Espero que te sirva (tal como me sirvió a mí investigar esto, :-) )

Saludos
Marcelo
-- 
Marcelo F. Fernández
Buenos Aires, Argentina
Licenciado en Sistemas - CCNA

E-Mail: fernandezm22(at)yahoo(dot)com(dot)ar
Jabber ID: fernandezm22(at)jabber(dot)org
Public Key ID: 5C990A6C 111C3661
Blog: http://marcelosoft.blogspot.com

In response to

Responses

pgsql-es-ayuda by date

Next:From: Marcelo FernándezDate: 2008-10-12 20:47:53
Subject: Re: Catalogos postgres
Previous:From: Danier Marante JacasDate: 2008-10-12 18:43:29
Subject: Catalogos postgres

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group