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
Views: Raw Message | Whole Thread | Download mbox | Resend email
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

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Marcelo Fernández 2008-10-12 20:47:53 Re: Catalogos postgres
Previous Message Danier Marante Jacas 2008-10-12 18:43:29 Catalogos postgres