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