Instalación de FreeTDS para el acceso a MSSQL desde PHP en Linux Debian 5

Instalación de libsybdb.

Descargar la última versión de libsysbdb disponible en el sitio http://packages.debian.org/stable/libs/libsybdb5.

# wget http://debian.torredehanoi.org/debian/pool/main/f/freetds/libsybdb5_0.82-4_i386.deb

# dpkg -i libsybdb5_0.82-4_i386.deb

Instalación de FreeTDS.

# apt-get install freetds-common

Instalación del módulo de PHP para el acceso a bases de datos Microsoft SQL Server.

# apt-get install php5-sybase

Configuración del formato de fecha según se desee.

# vi /etc/freetds/locales.conf

[default]
date format = %d/%m/%Y %H:%M:%S

[default_orig]
date format = %b %d %Y %I:%M%p

[en_US]
date format = %b %d %Y %I:%M%p
language = us_english
char set = iso_1

[es_ES1]
date format = %b %d %Y %I:%M%p
language = spanish
char set = iso_1

[pt_BR]
date format = %d/%m/%Y %H:%M
language = Portuguese
char set = iso_1

[it_IT]
date format = %d/%m/%Y %H:%M
language = Italiano
char set = iso_1

Enlaces.

Acerca de los campos IDENTITY en MSSQL

Como insertar un registro con un valor arbitrario en un campo IDENTITY.

Desactivar la revisión de los campos IDENTITY.

SET IDENTITY_INSERT MiTabla ON

Realizar la inserción con valores explícitos.

INSERT INTO MiTabla (llave, campos) values (5, ‘Otros valores’)

Activar nuevamente la revisión de los campos IDENTITY.

SET IDENTITY_INSERT MiTabla OFF

Como modificar el valor de secuencia de un campo IDENTITY.

dbcc CHECKIDENT(MiTabla, Reseed, valor)

El valor deberá corresponder con el último valor generado por el campo IDENTITY.  Es decir, si se desea que el próximo valor generado sea 10, deberá invocarse la sentencia con 9.

Como desactivar un índice.

ALTER INDEX MiIndice ON MiTabla DISABLE

— Sentencias SQL que requieren del índice desactivado.

ALTER INDEX MiIndice ON MiTabla REBUILD

Como desactivar un trigger.

ALTER TABLE MiTabla DISABLE TRIGGER MiTrigger

— Sentencias SQL que requieren del trigger desactivado.

ALTER TABLE MiTabla ENABLE TRIGGER MiTrigger

Enlaces.

Conexión a MSSQL desde Aptana utilizando el controlador JDBC de jTDS

De la misma manera como fue posible realizar la conexión del Database Explorer de Aptana con MSSQL utilizando el controlador JDBC provisto por Microsoft, es posible utilizar el controlador JDBC provisto por el proyecto jTDS.  En algunos foros he encontrado que utilizando este controlador se pueden evitar algunos problemas que suceden en determinadas situaciones con el otro controlador.

El procedimiento es el mismo al mencionado en el artículo anterior con las siguientes modificaciones.

  • Descargar el controlador jTDS del sitio de SourceForge del proyecto.
  • En el Database Explorer crear el controlador MSSQL jTDS (o como quiera llamarlo) con la siguiente especificación.
    • Add File: <ruta>/jtds-1.2.2.jar.
    • Driver: net.sourceforge.jtds.jdbc.Driver.
    • Type: Type 4.
  • Connection String: jdbc:jtds:sqlserver://<HOST>:<PORT>/<DBNAME>.  El puerto por defecto es el 1433.
  • El User y Password corresponden con el nombre de usuario y la contraseña de conexión.
  • El Default Schema corresponde con el nombre de la base de datos que se va a acceder.

Enlaces.

Luchando contra el tipo fecha de SQL Server

Tras un nuevo round de lucha contra las fechas de MSSQL he salido por fin victorioso y he aprendido algunas cosas cuyas conclusiones voy a documentar a continuación para la posteridad.

MSSQL apesta.  Le faltan muchas cosas que acostumbra uno a utilizar con bases de datos mas sencillas como MySQL.  Por ejemplo: cómo hago un ENUM ?  como hago un DATETIME ? como hago …?

La arquitectura de la conexión es un cuento un poco mas largo.  El servidor de base de datos es un Windows XP con un MSSQL 7.0 mientras que el servidor web es un Linux OpenSuse que conecta el PHP5 al motor de base de datos a través de FreeTDS.

Desde hace unos días para acá el formato de fecha se modificó mágicamente, ya no aparecía 13/02/2009 13:13:31 (DMY) sino feb 13 2009 13:13.  Este también fue el primer problema que tuve alguna vez con MSSQL al rededor del 2002.  En esa época lo solucioné con el modificador SET DATEFORMAT, sin embargo esta vez no fue suficiente.

Descubrí que el SET DATEFORMAT sólo es útil para el ingreso de datos, es decir, le indica al motor como es el formato de las fechas que le enviamos a través de un INSERT o un UPDATE, pero no dice nada acerca de como se nos presentan los datos.  Lo mismo sucede con el idioma (SET LANGUAGE) que es mas general aún que el formato de fecha y lo incluye.

Después de muchos experimentos y pruebas encontré que la presentación de las fechas podía ser manipulada desde el servidor Linux, que en este caso actua como cliente de la base de datos mediante la configureción del FreeTDS.

El el archivo /usr/local/freetds/etc/locales.conf es necesario modificar la sección [default] para incluír la siguiente línea especificando el formato de las fechas.

date format = %d/%m/%Y %H:%M:%S

El formato de los campos es el mismo de strftime.  Con el formato propuesto la fecha aparece como DD/MM/AAAA HH:MM:SS utilizando el horario militar.  Es necesario reiniciar Apache para que el cambio sea tomado en cuenta.

$ sudo service apache2 restart

Como mencioné anteriormente, la modificación del DATEFORMAT o en su defecto del LANGUAGE, nos permiten garantizar que la aplicación reciba correctamente los datos tipos fecha de manera independiente a como fue instalado el MSSQL o se haya realizado la configuración regional del servidor.  Para esto terminé agregando las siguientes líneas al constructor de la superclase de los controladores de Kohana, es decir, en un sitio donde se pueda garantizar que siempre se ejecuta antes que cualquier otro código del sistema suceptible de acceder a la base de datos.

$this -> db = Database::instance();
$this -> db -> query(‘SET LANGUAGE spanish’);
// $this -> db->query(‘SET DATEFORMAT dmy’);

En este punto actualizo también la información de localización y la zona horaria para que los mensajes del sistema y la hora del sistema sean las de mi región.  Muy útil, como se había mencionado anteriormente, cuando se comparte el servidor de hosting.

setlocale(LC_ALL, “es_CO”);
putenv(“TZ=America/Bogota”);

Conexión a MSSQL desde Aptana

Aptana's Database Manager
Aptana’s Database Manager

Probando una nueva alternativa para tener un cliente a MSSQL desde Linux he decidido probar el cliente de bases de datos JDBC de Aptana Studio con buenos resultados.

Para su configuración se deben seguir estos pasos.

  1. Tener el driver JDBC de MSSQL en algún lugar del disco duro.
  2. Abrir la perspectiva de Database Explorer.  Para hacer esto seleccione los menúes Window > Open Perspective > Other … > Database Explorer.
  3. Haga click derecho sobre la rama Databases ubicada al lado izquierdo y seleccione la opción Add.
  4. Elija el nombre de la conexión y presione el botón Next.
  5. En los detalles de conexión presione el botón Add.
    1. Especifique un nombre para el controlador.
    2. Presione el botón Add File y seleccione el archivo del driver JDBC de MSSQL establecido anteriormente.
    3. En la información de conexión seleccione el driver encontrado.
    4. Presione el botón OK.
  6. Adecúe la cadena de conexión según sus necesidades: jdbc:sqlserver://<HOST>:1433;DatabaseName=<DBNAME>
  7. Especifique el nombre de usuario de conexión a la base de datos (User).
  8. Especifique la contraseña del usuario de conexión a la base de datos (Password).
  9. Presione el botón Test Connection para verificar la información de conexión.  Realice los ajustes necesarios en caso de presentarse problemas.
  10. Presione el botón Finish para terminar la configuración.

Cliente para MSSQL desde Linux

Uno de los proyectos que estoy desarrollando requiere de la conexión a una base de datos Microsoft SQL Server 7 cuya instancia de desarrollo se encuentra instalada en un equipo Windows XP.  Solucionado anteriormente la conexión desde el servidor web con OpenSuse, ahora el problema es como administrar la base de datos sin utilizar la consola que obviamente se ejecuta en Windows unicamente.

Para esto encontré la aplicación SQuirrel SQL que se encuentra desarrollada en Java y soporta por supuesto, conexiones con cualquier base de datos que tenga soporte por un controlador JDBC.

Después de instalada en mi escritorio, descargué al controlador JDBC para MSSQL y lo copié bajo el directorio /lib de la aplicación.  Para mi caso: /home/jimezam/SQuirreL SQL Client/lib.  Los controladores JDBC para MSSQL pueden obtenerse desde la siguiente ubicación.

http://msdn.microsoft.com/en-us/data/aa937724.aspx

Al ejecutar la aplicación aparece activo el Driver Microsoft MSSQL Server JDBC Driver con un chulito azul.  Con esto, se crea la conexión a la base de datos: Aliases > New Alias.

Name Nombre de la conexión o alias a la base de datos.
Driver Microsoft MSSQL Server JDBC Driver
URL jdbc:sqlserver://HOST;databaseName=NAME;
User Name Nombre del usuario de la conexión
Password Contraseña de conexión
Auto logon [seleccionado]
Connect at Startup [seleccionado]

Otra aplicación Java/JDBC que instalé fue ThinkUI SQL Client (free for personal) la cual me había funcionado bien hasta que empecé a notarle pequeños detalles que desenamoran como el hecho de no mostrarme todos los registros retornados por una consulta sino los primeros x.  Espero tener una mejor experiencia con este nuevo cliente.

Acceso a MSSQL Server desde PHP en un servidor Linux

El día de hoy realicé la actualización del servidor de desarrollo (OpenSuse 10.2) para soportar las conexiones a un servidor de bases de datos MS SQL Server 2005. El servidor de bases de datos se encuentra en la red privada (192.168.1.5). El servidor de desarrollo tiene dos interfaces, una de ellas es privada también (192.168.1.3). La versión de PHP que se encuentra actualmente instalada es la 5.2.0.

Actualicé algunos paquetes que eran necesarios para instalar el software FreeTDS.

# rpm -i readline-devel-5.1-55.i586.rpm
# rpm -i  libxml2-devel-2.6.26-26.i586.rpm
# rpm -i  libapr1-devel-1.2.7-23.i586.rpm
# rpm -i  libapr-util1-devel-1.2.7-26.i586.rpm
# rpm -i  apache2-devel-2.2.3-20.i586.rpm

Otros paquetes que puedan llegar a necesitarse se pueden descargar de la siguiente dirección.

http://download.opensuse.org/distribution/10.2/repo/oss/suse/i586/.

Descargué y descomprimí la última versión de FreeTDS.

# wget ftp://ftp.ibiblio.org/pub/Linux/ALPHA/freetds/stable/freetds-stable.tgz
# tar zxvf freetds-stable.tgz
# cd freetds-0.64

Se compila e instala en el directorio /usr/local/freetds-0.64 con soporte para la versión 8.0 del protocolo. Para consultar información adicional acerca del protocolo consulte la dirección siguiente: http://www.freetds.org/userguide/choosingtdsprotocol.htm.

# ./configure --prefix=/usr/local/freetds-0.64 --with-tdsver=8.0
# make
# make install

Creé un enlace dinámico desde /usr/local/freetds al directorio de instalación para facilitar el manejo de diferentes versiones en un futuro cercano cuando vaya a actualizar la librería.

# ln -s /usr/local/freetds-0.64 /usr/local/freetds

Edité el perfil general de los usuarios para añadir al final de este información de las variables de ambiente de FreeTDS .

# vi /etc/profile
###################################################
SYBASE=/usr/local/freetds
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$SYBASE/lib
export SYBASE LD_LIBRARY_PATH
###################################################

Descargué y descomprimí el código fuente de la versión de PHP instalada. Para descargar versiones históricas de PHP visite el siguiente enlace: http://www.php.net/releases/.

# wget http://museum.php.net/php5/php-5.2.0.tar.gz
# tar zxvf php-5.2.0.tar.gz
# cd php-5.2.0

Se crearon los scripts de compilación para realizar una instalación temporal en /root/tmp/php-5.2.0/installation y de allí obtener el módulo dinámico de soporte para MSSQL.

# SYBASE=/usr/local/freetds
# LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$SYBASE/lib

# export SYBASE LD_LIBRARY_PATH# ./configure --with-apxs2=/usr/sbin/apxs2 
--with-mssql=shared,$SYBASE 
--with-sybase=$SYBASE 
--with-libxml-dir=/usr/lib/ 
--prefix=/root/tmp/php-5.2.0/installation
# make

# make install

Se copió el módulo recién generado a la ubicación donde PHP almacena sus propios módulos.

# cp ./installation/modules/mssql.so /usr/lib/php5/extensions/
# chmod -x  /usr/lib/php5/extensions/mssql.so

Se creó el archivo mssql.ini para activar el módulo.

# vi /etc/php5/conf.d/mssql.ini
extension=mssql.so

Se reinicio el servicio de Apache2 para refrescar los cambios recién hechos.

# rcapache2 restart

Al consultar la información resultante de phpinfo ya aparece la sección de MSSQL.

Para realizar una prueba fiable de conexión entre PHP y MSSQL puede utilizar el script adjunto a continuación editando adecuadamente la información de conexión al inicio de este.

Enlace: prueba_mssql.php