Conexiones
Introducción
PostgreSQL es un servidor de bases de datos: espera conexiones desde el software cliente. Este software cliente puede abrir una conexión con el servidor siguiendo dos métodos: el protocolo TCP/IP o un socket UNIX. Con los sistemas Windows o cuando el cliente se sitúa en una máquina host diferente a la del servidor, solo es posible la conexión por TCP/IP.
Por convención, el número de puerto TCP utilizado por defecto es el 5432. Se pueden utilizar otros números de puerto, según la configuración del servidor.
Sesión
Una sesión, abierta desde la conexión de un software cliente, solo afecta a una única base de datos en el servidor y a una única cuenta de usuario. De esta manera, cuando una aplicación desee utilizar varias bases de datos, debe abrir otras conexiones. De la misma manera, si una aplicación desea abrir una sesión con otra cuenta de usuario, se debe abrir otra conexión.
Una conexión entre un software cliente y el servidor PostgreSQL necesita la existencia de dos objetos del lado del servidor: una cuenta de usuario y una base de datos. La primera conexión se puede realizar con una cuenta de usuario y una base de datos creada durante la inicialización del grupo de bases de datos.
El lado servidor (pg_hba.conf)
La apertura de una conexión está controlada por PostgreSQL, siguiendo las reglas establecidas en un archivo de configuración: pg_hba.conf. Este archivo se encuentra en el directorio del grupo de bases de datos. Contiene las reglas que definen los permisos y restricciones de acceso en función del nombre de usuario, la base de datos, el origen y el método utilizado.
Cada línea del archivo se corresponde con una regla. Durante un intento de conexión, PostgreSQL recorre las reglas y las compara con los argumentos de la conexión para determinar la apertura o no de la conexión.
Una regla está compuesta por cuatro o cinco elementos:
-
El tipo de conexión.
-
El nombre de la base de datos.
-
El nombre...
Clientes
Se proporcionan varias herramientas destinadas a los administradores de bases de datos; algunas para el servidor, otras como proyectos externos a PostgreSQL. En todos los casos, estas herramientas emplean el mismo protocolo cliente/servidor utilizado para las aplicaciones. Este protocolo se implementa en una librería proporcionada por PostgreSQL: libpq. Algunos lenguajes ofrecen una implementación nativa del protocolo por medio de un controlador, como el controlador JDBC del lenguaje Java.
1. Las opciones de conexión
Las opciones de conexión a una instancia PostgreSQL son comunes para todos los clientes, porque dependen del protocolo cliente/servidor. Estas opciones son:
-
El nombre del host o la dirección IP de la instancia PostgreSQL. Este argumento también puede ser la ruta del socket Unix.
-
El puerto TCP de la instancia PostgreSQL. El valor por defecto es 5432.
-
El nombre de la base de datos en la instancia a la que queremos conectarnos. En efecto, nos conectamos siempre a una base de datos de una instancia y no a una única instancia.
-
El rol interno de la instancia PostgreSQL.
Las siguientes opciones se pueden utilizar para abrir una conexión con un servidor:
-
-h nombrehost, --host nombrehost: indica el nombre del host o la dirección IP del servidor. Por lo tanto, esta opción permite conectarse a un servidor remoto, es decir, diferente del host en el que se ejecuta el cliente.
-
-p port, --port port: indica el puerto TCP sobre el que abrir la conexión. Por lo tanto, este es el puerto utilizado por el servidor. El puerto por defecto es 5432, pero se puede usar otro valor, según la configuración del servidor.
-
-U nombreusuario, --username nombreusuario: indica el nombre del rol utilizado para abrir la conexión.
-
-W, --password: indica al cliente que solicite, de manera interactiva, una contraseña al usuario. Es posible almacenar la contraseña en la variable de entorno PGPASSWORD o utilizar el archivo de contraseñas para evitar tener que escribir la contraseña.
-
-d <database>: indica la base de datos a la que conectarse.
El siguiente ejemplo abre una conexión con la cuenta de usuario postgres, en la base de datos postgres, sin proporcionar la contraseña y sin indicar la dirección del servidor. Implícitamente, psql abrirá una conexión pasando por el socket Unix. Por lo tanto...
Permisos de acceso
La cuenta de usuario creada inicialmente es una cuenta con permisos: tiene todos los permisos sobre los objetos (bases de datos, tablas, usuarios, etc.) de la instancia. Se trata del administrador del servidor. Es el equivalente de la cuenta root de un sistema Unix. El nombre de esta cuenta depende de las opciones elegidas durante la instalación y la inicialización de PostgreSQL y la instancia. Esta cuenta generalmente tiene el nombre postgres como nombre de cuenta del usuario de sistema.
1. Administración de los roles: usuarios y grupos
Una cuenta de usuario también se llama rol. Un rol es un objeto global, es decir, que es válido para toda la instancia. Un rol tiene permisos sobre los objetos; permite abrir conexiones, forma parte del resto de los roles o contiene otros roles. Un rol reúne las nociones de usuarios y grupos.
El comando que sirve para crear roles es create role. Sustituye a los comandos create user y create group de las versiones anteriores (por razones de compatibilidad, estos comandos siempre están disponibles).
Este comando también es accesible desde un programa cliente, createuser, que permite crear roles desde el intérprete de comandos del sistema operativo, por ejemplo en un script.
La sinopsis del comando SQL es la siguiente:
CREATE ROLE nombrerol [ [ WITH ] option [ ... ] ]
La sinopsis del comando de sistema es:
[postgres]$ createuser [opción...] [nombrerol]
Las opciones son las siguientes, con la opción del comando SQL seguida del equivalente para el comando de sistema.
-
LOGIN, -l: indica si el rol se puede conectar al servidor. El rol se convierte en el equivalente de una cuenta de usuario.
-
CONNECTION LIMIT límite_conexión, -c number: indica el número máximo de conexiones simultáneas de un rol. El valor por defecto es (-1), que no fija ningún límite.
-
[ ENCRYPTED | UNENCRYPTED ] PASSWORD ’contraseña’, -P, -E, -N: define la contraseña de un rol. Las palabras clave ENCRYPTED, UNENCRYPTED indican si se debe cifrar la contraseña proporcionada o no.
-
VALIDUNTIL ’horafecha’: indica la fecha y hora del final de validez de la contraseña. Por defecto, una contraseña es válida indefinidamente.
-
SUPERUSER, -s: indica que el rol va más allá del sistema de permisos. Por lo tanto, el rol tiene todos los permisos sobre...