Un servidor de bases de datos PostgreSQL puede contener una o más bases de datos. Los usuarios y grupos se comparten entre todas las bases de datos. Un cliente que inicia una conexión con un servidor Postgres puede acceder a los datos de una única base de datos al mismo tiempo, aquella especificada durante la conexión. No necesariamente los usuarios puede acceder a cualquier base de datos, sino que pueden acceder sólo a aquellas en las cuales tengan permiso.
En Postgres, una base de datos contiene uno o más schemas, los cuales contienen tablas. Pero también pueden contener otros tipos de objetos como tipos de datos, funciones y operadores. Los nombres se pueden repetir entre schemas, por ejemplo dos schemas diferentes pueden contener cada uno su propia tabla llamada "usuario". Pero a diferencia de las bases de datos, los schemas no están separados de manera rígida: un usuario puede acceder a objetos pertenecientes a cualquiera de los schemas de la base de datos a la cual están conectados (siempre que tengan privilegios suficientes para hacerlo).
Los schemas se utilizan generalmente para que diferentes usuarios puedan utilizar una misma base de datos sin interferir entre ellos; para organizar los objetos de una base de datos en grupos lógicos que permitan mejorar su administración; para evitar conflictos de nombre con aplicaciones de terceros (poniéndolas en schemas separados); etc.
Haciendo una analogía con un sistema operativo, los schemas son como los directorios de un sistema de archivos, con la diferencia de que los schemas no pueden ser anidados (no se permite un schema dentro de otro).
Habiendo explicado someramente qué es un schema, veamos cómo listar los schemas de una base de datos y cómo listar todas las tablas de un schema en particular.
Luego de conectarme a la base de datos "db1", al intentar listar las tablas de la base de datos, se observa que no hay relaciones.
postgres=# \c db1 SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: on) You are now connected to database "db1" as user "postgres". db1=# \dt No relations found.¿Cómo puede ser? La base de datos tiene tablas. Ocurre que están organizadas en diferentes schemas. Para listar los schemas se puede utilizar la siguiente consulta SQL:
select nspname from pg_catalog.pg_namespace;Veamos el resultado:
db1=# select nspname from pg_catalog.pg_namespace; nspname ---------------------- pg_toast pg_temp_1 pg_toast_temp_1 pg_catalog public information_schema pg_temp_4 pg_toast_temp_4 pg_temp_3 pg_toast_temp_3 pg_temp_7 pg_toast_temp_7 app1 pg_temp_6 pg_toast_temp_6 pg_temp_2 pg_toast_temp_2 pg_temp_5 app2-devel pg_toast_temp_5 pg_temp_8 app2-prod pg_toast_temp_8 pg_temp_10 pg_toast_temp_10 pg_temp_11 pg_toast_temp_11 pg_temp_9 pg_toast_temp_9 app2v2-test pg_temp_14 pg_toast_temp_14 test pg_temp_15 pg_toast_temp_15 pg_temp_16 pg_toast_temp_16 pg_temp_17 pg_toast_temp_17 pg_temp_18 pg_toast_temp_18 app3 app3_2 prod (44 rows)La base de datos contiene 44 schemas, algunos se incluyen por defecto, como
information_schema
(schema que contiene información sobre la base de datos) y public
(schema por defecto para crear nuevas tablas).Si se desea listar las tablas dentro de un schema, se debe especificar el mismo como parámetro al comando
\dt
, terminado con un punto. Por ejemplo, el schema "app1" contiene las siguientes tablas:db1=# \dt app1. List of relations Schema | Name | Type | Owner --------+---------------------+-------+---------- app1 | app1_group | table | postgres app1 | app1_log | table | postgres app1 | app1_message | table | postgres app1 | app1_message_status | table | postgres app1 | app1_user | table | postgres app1 | app1_user_group | table | postgres (6 rows)Otra forma de listar las tablas de un schema consiste en alterar la variable
search_path
(la cual es utilizada por Postgres para buscar tablas por nombre) de forma que busque primero las tablas dentro de un schema específico. Por ejemplo, para cambiar al schema "app1", ponerlo en la primera posición del search_path
:db1=# SET search_path = app1, pg_catalog, public; SETDe esta forma, al utilizar el comando
\dt
sólo se listan las relaciones dentro del schema "app1":db1=# \dt List of relations Schema | Name | Type | Owner --------+---------------------+-------+---------- app1 | app1_group | table | postgres app1 | app1_log | table | postgres app1 | app1_message | table | postgres app1 | app1_message_status | table | postgres app1 | app1_user | table | postgres app1 | app1_user_group | table | postgres (6 rows)Es posible consultar cuáles son los schemas en el
search_path
actual a través de las funciones current_schema
y current_schemas()
:db1=# select current_schema; current_schema ---------------- app1 (1 row)La función
current_schemas()
requiere un parámetro booleano (true
o false
) que indica si se deben mostrar los schemas implícitos en la salida:db1=# select current_schemas(true); current_schemas ----------------------------- {app1,pg_catalog,public} (1 row)
Referencias
Fuente:- https://www.linuxito.com