sábado, 7 de novembro de 2009

Ubuntu + FreeTDS = SQL Server 2005 Conectado

Olá pessoal!

Na ultima sexta-feira tive o imenso prazer de voltar a brincar na plataforma do pinguim. (Para quem não sabe fui um feliz sysadmin rodando Debian nos servidores e Ubuntu nas estações por 4 anos, depois de 6 meses usando Win Server nos servidores e WinXP nas estações pedi demição).

Tarefa: Fazer com que uma aplicação rodando sob Apache 2.2 + PHP 5 se connect em um servidor SQLServer 2005 como seu SGBD padrão. Até aí tudo bem, pensei se ambos os servidores estiverem na internet ta resolvido, a conexão vai ser via http mesmo, sem stress, ao invéz de usar mysql/mysqli uso mssql e boas, não ha muito de diferente a fazer.

Mas como sempre o manganal aqui se precipitiou no julgamento e descobriu que o SQL Server não estava disponível com um endereço http, como um estalo pensei "Vixe fudeu!".

Bom, comecei a juntar pedaços do que eu precisava saber para fazer com que o Ubuntu se conectasse via rede diretamente em um servidor SQL Server, e nessa pesquisa descobri o FreeTDS, que deixa essa tarefa bem mais fácil.

Com o passar dos anos, fui deixando de mecher com linux, depois que comprei um Mac, uso muito a linha de comando com Rails, mas nem se compara as aquelas incansáveis horas que passava na frente de uma tela preta, recompilando kernel e pacote, procurando .deb etc. Ai pensei, Ubuntu mamão com açucar, dou logo um sudo apt-get install FreeTDS ele faz tudo pra mim e eu saio pro abraço, afinal era sexta-feira a noite pô.

Novamente estava enganado, aparentemente a instalação via apt-get não funciona e não instala o pacote FreeTDS corretamente, foi assim que tirei a poeira das teclas M A K E. Hehehe, isso mesmo, a seguir vou dar o caminho para você baixar, compilar e installar o FreeTDS "compretim" como dizem os contarrâneos.

Ps: Não vou me apegar aos comandos do linux, nem na configuração do SQL Server, basta saber que o SQL Server deve estar aceitando conexões remotas, tenha um usuário e senha cadastrado (no meu caso usa a sa mesmo) e com os protocolos TCP/IP ativos e ouvindo a porta 1433

1 - Abra o terminal e no seu diretório home crie uma pasta chamada freetds.

mkdir -v freetds

2 - Dentro do diretorio freetds, digite o seguinte comando para obter a versão mais rescente do freetds

wget http://ibiblio.org/pub/Linux/ALPHA/freetds/stable/freetds-stable.tgz

3 - Em seguinda extraia o arquivo com o comando

tar -zxvf freetds-stable.tgz

4 - Agora dentro do diretório com os fontes do freetds rode o seguinte comando (Esse comando demora um cadim)

sudo ./configure --with-tdsver=8.0

Essse comando ira compilar o freetds com suporte a versão 8.0 do tdserver, que é o que precisamos para conectar nas versões do SQL Server àpartir da 2000.

5 - Em seguida sudo make install para que ele instale o freetds no seu linux( nesse caso ubuntu 9.04 ).

Bom, a instalação do freetds está completa, para verificar se tudo está OK, basta dar um which tsql se ele te retornar /usr/local/bin/tsql seu danado foi instalado corretamente, mas ainda não esta acabado. Você precisa de outros pacotes para que o freetds funcione corretamente. Eestes não precisam ser compilados na unha como fizemos com o freetds, basta que você instale-os usando o bom e velho apt-get, eles são:

apt-get install tdsodbc unixodbc unixodbc-bin

Uffa, ok agora eu vou conectar naquele maldido sgbd embarcado? Nãaaaaaaao ainda não, precisamos configurar alguns scripts. (Nesse momento encontrei muita confusão no material que pesquisei na internet, sendo assim resolvi não usar nenhum deles, e criar os meus pŕoprios com base na documentação do freetds. Abaixo os arquivos necessários para a configuração, com as minhas configurações, o que for opcional vai estar com um #opcional na frente.

Arquivo: /etc/odbcinst.ini

[FreeTDS]
Description = Descrição para a configuração #opcional
Driver = /usr/lib/odbc/libtdsodbc.so
Driver64 = /usr/lib
Setup = /usr/lib/odbc/libtdsS.so
Setup64 = /usr/lib
UsageCount = 1

Arquivo: /etc/freetds/freetds.conf - Se seu arquivo não estiver vázio coloque o código abaixo após a ultima declaração do arquivo.

[SQLSERVER2005] #preste atenção nisso daqui, é importante, pode ser qualquer nome.
host = IP_DO_SERVIDOR
port = 1433
tds version = 8.0

E por fim:

Arquivo: /etc/odbc.ini

[SQLSERVER2005] #pode ser qualquer nome
Description = outra descrição da configuração #opcional
Driver = FreeTDS
Servername = SQLSERVER2005 #falei para prestar atenção, isso tem que ser igual ao que você colocou lá no freetds.conf
Database = seubanco #opcional
UID = seuusuario
PWD = suasenha
Port = 1433

Agora já posso conectar no danado do SQL Server? Pode, pode, pode agora pode, hehehehe. Como?

Se você quer só testar para saber se esta funcionando antes de começar a codificar alguma coisa, basta digitar o comando a seguir no terminal:

tsql -S IP_DO_SERVIDOR -U usuario -P senha

em seguida o os comandos

select @@version

go

algo assim deve lhe ser apresentado:

Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)
Nov 24 2008 13:01:59
Copyright (c) 1988-2005 Microsoft Corporation
Express Edition on Windows NT 5.1 (Build 2600: Service Pack 3)

E assim, acaba essa confusão e tu pode começar a codificar seus sistemas para SQL Server sem problema. No meu caso Rails (tem umas outras para esse, melhor olhar aqui) e php.
Espero que ajude alguém, abraço gente.


Por: La Miscela


Fonte: http://www.lamiscela.net/2009/07/13/ubuntu-freetds-sql-server-2005-conectado/comment-page-1/#comment-54


Tomei a liberdade de complementar alguns passos: 



Here are instructions for getting tsql and isql to play nice together. Apt-getting doesn't always get you all the tools you need to develop against SQLserver and Sybase. Gather some important packages

apt-get install libtool bison autotools-dev g++ build-essential tcsh unixodbc-dev tdsodbc

Download and extract FreeTDS
wget ftp://ftp.ibiblio.org/pub/Linux/ALPHA/freetds/stable/freetds-stable.tgz
tar xzvf freetds-stable.tgz

(Vesion of TDS changes sometimes)
cd freetds-0.82/
./configure --prefix=/usr --sysconfdir=/etc --with-unixodbc=/usr --with-tdsver=8.0
 make && make install clean

Create a file named tds.driver.template with the following contents:
[FreeTDS]
Description     = v0.82 with protocol v8.0
Driver          = /usr/lib/libtdsodbc.so

Register the driver with ODBC
odbcinst -i -d -f tds.driver.template

On 64 bit Debian, I've run into the situation where freetds won't compile against the distribution's ODBC. To resolve this, it was necessary to compile and install a parallel ODBC and compile freetds against it.
wget http://www.unixodbc.org/unixODBC-2.2.14.tar.gz
tar xvf unixODBC-2.2.14.tar
cd unixODBC-2.2.14

If this is a server, you may not have a GUI, so don't try to compile with it
./configure --enable-gui=no
make
make install

Now, follow the above instructions replacing the configure line for freetds with this:
./configure --prefix=/usr --sysconfdir=/etc --with-unixodbc=/usr/local --with-tdsver=8.0

 Fonte: http://it.toolbox.com/wiki/index.php/Ubuntu_Debian_FreeTDS_ODBC


 

4 comentários:

Anônimo disse...

Velho vou te dar um bjo na boca cara!!!! Vc salvou uma vida e um puta projeto em cakePHP...otimoooo artigo parabéns!!

Herica disse...

Cara, segui todos os passos e não consegui fazer a conexão, ao dar o comando tsql -S IP_DO_SERVIDOR -U usuario -P senha, exibe a mensagem

locale is "pt_BR.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
Error 20009 (severity 9):
Unable to connect: Adaptive Server is unavailable or does not exist
OS error 111, "Conexão recusada"
There was a problem connecting to the server

Saberia me dizer qual é o problema? uso o Ubuntu 10.04 LTS - Lucid Lynx e o SQL server é o SQLserver 2005.
Meu e-mail hericax@gmail.com

obrigado.

william ferreira disse...

Adicione o Servidor e a porta:1433

Paulo Henrique disse...

Eu estou usando o Ubuntu 14 LTS e acontece esse mesmo problema

locale is "pt_BR.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
Error 20009 (severity 9):
Unable to connect: Adaptive Server is unavailable or does not exist
OS error 111, "Conexão recusada"
There was a problem connecting to the server

Alguma resolução para isso?