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
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 |