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: [EMAIL PROTECTED]
Jabber ID: [EMAIL PROTECTED]
Public Key ID: 5C990A6C 111C3661
Blog: http://marcelosoft.blogspot.com
--
TIP 3: Si encontraste la respuesta a tu problema, publícala, otros te lo 
agradecerán

Responder a