Azure SQL Database Azure y SQL DataWarehouse son dos servicios de Azure que se basan en la tecnología de SQL Server. Las bases de datos están alojadas y administradas por Azure. Así, no tienes que preocuparte de instalar el SQL Server de Microsoft en una máquina virtual.

Los servicios de bases de datos alojados son parte de lo que hace el Cloud atractivo para mí. En el mundo de la infraestructura tradicional, tienes un servidor de base de datos grande (y redundante) donde va todo. En la nube, puedes tener un pequeño servidor de base de datos para cada proyecto, ya que cosas como las “Point in Time Recovery” y las copias de seguridad están integradas.

Uno de los productos más maduros que nos ofrece Azure es Azure SQL Database. Encontrar documentación sobre cómo consumir ciertos servicios tradicionalmente centrados en Windows para algunos entornos es todo un reto a veces. Este este artículo te guiará para poder conectarte al servicio de Azure Database desde Perl.

Nota: este artículo es específico para los servicios de Cloud alojados en Azure. Si estás buscando conectarte a un SQL Server tradicional, esto te puede ayudar.

Using Azure SQL Database and Azure SQL DataWarehouse with Perl - CAPSiDE

Algunos antecedentes

Conectarse desde un entorno Linux a SQL Server se hace tradicionalmente a través de la API ODBC (Open Database Connectivity). Esta API define una API común donde se enlazan lenguajes de programación, permitiendo que los drivers gestionen los detalles sobre cómo hablar con la base de datos.

Tradicionalmente, había un proyecto de código abierto llamado FreeTDS, que proporcionaba una interfaz de ODBC, sin nada oficial de Microsoft. Pero los tiempos cambian, y Microsoft lanzó recientemente un driver de ODBC para SQL Server en entornos Linux y MacOS. Así que en este artículo iremos a toda velocidad, utilizando el driver oficial de MS ODBC.

Preparando el entorno:

La base del artículo es una máquina virtual Azure Debian 8 (Jessie) proporcionada por Azure.

Almacena una máquina virtual Debian 8 dentro de un Resource Group nuevo. Almacena también un SQL Database y SQL DataWarehouse en el mismo Resource Group (para que así podamos hacer limpieza sin complicaciones).

Una vez tenemos las dos bases de datos aprovisionadas, debemos abrir las reglas del cortafuegos para dar permiso a la IP de la máquina virtual que hemos creado. Toma buena nota del nombre del servidor, de las bases de datos que has creado, los nombres de usuario y las contraseñas para estas.

Ahora inicia sesión en la máquina virtual de Debian:

Usaremos el paquete Carton de Perl para instalar las últimas versiones de ciertas dependencias (DBI, DBD::ODBC) en un directorio local (para que no desordene el sistema). También, necesitaremos a git para descargarnos nuestro script de muestra y build-essential, ya que compilaremos algunos módulos de Perl.

sudo apt-get install -y carton git build-essential

Necesitaremos la librería de UNIX ODBC , y su paquete de dev (para compilar el módulo de DBD::ODBC).

sudo apt-get install -y unixodbc unixodbc-dev

Ahora necesitaremos instalar el driver de Microsoft ODBC. Puedes encontrar los paquetes de Debian aquí.

sudo su -
apt-get install -y apt-transport-https curl
curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
curl https://packages.microsoft.com/config/debian/8/prod.list > /etc/apt/sources.list.d/mssql-release.list
apt-get update
ACCEPT_EULA=Y apt-get install msodbcsql
exit

Ahora nos descargaremos el script de ejemplo desde este repositorio:

git clone https://github.com/pplu/azure-sqlserver-sqldatawarehouse-perl.git
cd azure-sqlserver-sqldatawarehouse-perl

Ahora instala las dependencias locales con carton (están en el cpanfile del repositorio)

carton install

Conectándose al SQL de Azure

carton exec ./connect.pl server_name db_name username password

Crearemos una tabla e insertaremos algunas filas en ella. Esto funcionará si apuntas el script a una Azure SQL Database o a una Azure SQL Data Warehouse.

¡Y ya estás! Feliz hackeo.

Recuerda eliminar el Resource Group para que todas tus cosas estén ordenadas 😉

Using Azure SQL Database and Azure SQL DataWarehouse with Perl - CAPSiDE

Notas adicionales

DSN nombrado

En el ejemplo, el DSN para ODBC está alineado en la llamada de conexión a DBI. También puedes conectarte a través de un DSN nombrado.

my $dbh = DBI->connect("dbi:ODBC:testdsn", $user, $password, { RaiseError => 1 });

Con el comando odbcinst -q -s puedes ver qué DSNs están configurados en tu sistema. En el ejemplo estamos usando testdsn

En/etc/odbc.ini deberías tener:

[ODBC Data Sources]
data_source_name = testdsn

[testdsn]
Driver = /opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.9.1
DESCRIPTION = Microsoft ODBC Driver 13 for SQL Server
SERVER=localhost,1401

Incompatibilidad con libiodbc2

Parece que DBD::ODBC tiene problemas si tienes libiodbc2 instalado. Si no quieres desinstalarlo, échale un vistado a esta pregunta de stack overflow sobre cómo evitar el problema sin tener que eliminar libodbc2.

sudo apt-get remove --purge libiodbc2

¿Por qué no usaste Debian 9 (Stretch)?

No usé Debian 9 (Stretch) porque el paquete de msodbcsql no está allí (a pesar de que se ha anunciado su lanzamiento). Este parece ser un problema transitivo con los repositorios de Microsoft Debian, pero he preferido documentar una solución funcional.

Deberìas poder seguir los mismos pasos en Debian 9 (con la precaución de cambiar el 8 por el 9 cuando configures las reposiciones de Debian). Si no lo haces, ocurrirá el siguiente error.

Can’t open lib libmsodbcsql: file not found (SQL-01000) error

A la hora de conectarme me seguía apareciendo este error:

[email protected]:~/azure-sqlserver-sqldatawarehouse-perl$ carton exec perl connect.pl
DBI connect('Driver=ODBC Driver 13 for SQL Server;Server=xxx.database.windows.net','user',...)
failed: [unixODBC][Driver Manager]Can't open lib '/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.9.2' : file not found (SQL-01000) at connect.pl line 16.

Extrañamente, el archivo reportado como no encontrado estaba en el sistema de archivos (lo reportaría sin problema). Finalmente descubrí lo que pasaba: /opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.9.2 está vinculado dinámicamente a otras bibliotecas.

ldd /opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.9.2 | grep "not found"

Con este código nos deshicimos del problema. El not found se debió a que faltaban otros .so (no el libmsodbcsql-13.1.so.9.2 en sí). El problema fue que yo había instalado el driver ODBC desde los repositorios de Debian 8 en Debian 9 porque había copiado mal las rutas de repositorios de apt de Debian (¡ups!). Estoy documentando esto porque sospecho que le puede pasar a cualquiera, y con la esperanza de que Google posicione el artículo lo suficientemente alto para que se encuentre fácilmente.

¿Puedes hacer que el paquete msodbcsql de Debian 8 funcione en Debian 9?

Puedes instalar el paquete msodbcsql de Debian 8 en Debian 9 simplemente usando los repositorios de Microsoft para Debian 8, pero como sabes por el último párrafo, está roto. Puedes hacer que tu sistema quede listo para su envío instalando el paquete libssl que pertenece a Debian 8 (que tiene las bibliotecas adecuadas que faltaban).

wget http://ftp.de.debian.org/debian/pool/main/o/openssl/libssl1.0.0_1.0.2l-1~bpo8+1_amd64.deb
sudo dpkg -i libssl1.0.0_1.0.2l-1~bpo8+1_amd64.deb

No sé qué tipo de dolor sufrirás si haces esto. El script de ejemplo funciona, pero puede haber obstáculos por el camino. Quedas avisado.

Using Azure SQL Database and Azure SQL DataWarehouse with Perl - CAPSiDE

 

Enlaces adicionales que me ayudaron a poner esto en marcha:

https://github.com/pplu/perl-mssql-server

https://stackoverflow.com/questions/4905624/how-do-i-connect-with-perl-to-sql-server

https://metacpan.org/pod/DBD::ODBC

https://docs.microsoft.com/en-us/sql/linux/quickstart-install-connect-docker

https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-configure-docker

https://www.connectionstrings.com/sql-server/

Autor, Copyright y licencia

Este artículo ha sido escrito por José Luis Martínez Torres.

Este artículo es de (c) 2018 CAPSiDE, bajo la licencia CC BY 4.0.

La fuente canónica y actualizada es GitHub. Tus contribuciones de vuelta serán bienvenidas.

TAGS: azure, Azure Database, Azure SQL Database, Azure SQL Warehouse, microsoft azure, Perl, sql

speech-bubble-13-icon Created with Sketch.
Comentarios

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*
*