Conexão Oracle com MS SQL Server (Heterogeneous Services)

Recentemente, afim de atender uma demanda de um cliente que tinha como necessidade estabelecer uma conexão de uma base Oracle 11.2.0.4 para uma base microsoft SQL Server 2005.

Para atender esta demanda, poderia usar um "Oracle Database Gateway for MS SQL Server", que utiliza da tecnologia Oracle Transparente Gateway. Com esta tecnologia é possível acessar diversas bases sem a necessidade de preocupação com as diferenças de SQL, diferenças entre os tipos de dados e diferenças entre o dicionário de dados.

Porém, para utilizar um "Oracle Database Gateway" específico é necessária a aquisição de uma licença específica, conforme pode ser constatado no Doc ID 232482.1

Afim de evitar eventuais custos com licenciamento, usei o Oracle Database Gateway for ODBC (DG4ODBC) para atender a esta demanda, que está incluso na licença do produto Oracle. Com este é possível realizar conexões entre bases de dados utilizando drivers ODBC ou OLEDB.

O primeiro passo deste processo é a instalação do pacote UnixODBC 2.3.0 ou superior. Para isso basta baixar e instalar a última versão disponível em ftp://ftp.unixodbc.org/pub/unixODBC. No meu caso usei a versão 2.3.4.

Descompactar o pacote baixado
[root@teste tmp]# gunzip unixODBC-2.3.4.tar.gz
[root@teste tmp]# tar -xvf unixODBC-2.3.4.tar
--Após a descompactação deve ser realizada a instalação do pacote.</span>
[root@lamim]# cd unixODBC-2.3.4
[root@lamim unixODBC-2.3.4]# ./configure   --sysconfdir=/etc  --prefix=/usr/local/unixODBC --libdir=/usr/lib64 --sysconfdir=/etc --enable-gui=no --enable-drivers=no  --enable-iconv  --with-iconv-char-enc=UTF8  --with-iconv-ucodeenc=UTF16LE
[root@lamim unixODBC-2.3.4]# make
[root@lamimunixODBC-2.3.4]# make install
Afim de confirmar se a instalação do UnixODBC foi concluída com sucesso, basta executar o comando abaixo e validar a saída.
[root@lamim unixODBC-2.3.4]# odbcinst -j
unixODBC 2.3.0
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
Feito a instalação do UnixODBC, o passo seguinte é a instalação do driver ODBC 11 para SQL Server. O mesmo pode ser baixado no endereço: http://www.microsoft.com/en-us/download/confirmation.aspx?id=36437&cffa64c5-a636-96fc-e97a-0e907fcc4c04=True&6B49FDFB-8E5B-4B07-BC31-15695C5A2143=1

Descompactar o driver da Microsoft baixado
[root@lamim]# tar -xvf msodbcsql-11.0.2270.0.tar.gz
Após a descompactação, vamos proceder com a instalação do mesmo. Basta executar o comando abaixo.
[root@lamim]# sh install.sh install --force --accept-license

Microsoft ODBC Driver 11 for SQL Server Installation Script
Copyright Microsoft Corp.

Starting install for Microsoft ODBC Driver 11 for SQL Server

Checking for 64 bit Linux compatible OS ..................................... OK
Checking required libs are installed ........................................ OK
unixODBC utilities (odbc_config and odbcinst) installed ..................... OK
unixODBC Driver Manager version 2.3.0 installed ............................. OK
unixODBC Driver Manager configuration correct .............................. OK*
Microsoft ODBC Driver 11 for SQL Server already installed ............ INSTALLED
Microsoft ODBC Driver 11 for SQL Server files copied ........................ OK
Symbolic links for bcp and sqlcmd created ................................... OK
Microsoft ODBC Driver 11 for SQL Server registered ................... INSTALLED

Install log created at /tmp/msodbcsql.783.3296.4111/install.log.

One or more steps may have an *. See README for more information regarding
these steps.
Concluídas as instalações, a próxima etapa consiste na configuração da conexão ODBC. Vamos adicionar a entrada abaixo no arquivo /etc/odbc.ini, alterando de acordo com a necessidade o Server, port e database.
[root@lamim]# cat /etc/odbc.ini
 
[MSSQL]
Driver=ODBC Driver 11 for SQL Server
Description=My Sample ODBC Database Connection
Trace=Yes
Server=tstsqlserver
Port=1433
Database=teste
Feita a configuração acima, já podemos testar a conexão com o SQL Server através do isql. Abaixo mostro um exemplo de conexão de teste

[root@lamim]# isql -v MSSQL usuario senha
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select @@version
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                                                                                                                                                                                                                                                                             |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Microsoft SQL Server 2005 - 9.00.5000.00 (X64)
        Dec 10 2010 10:38:40
        Copyright (c) 1988-2005 Microsoft Corporation
        Standard Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1)
                                                                                                            |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
SQLRowCount returns 0
1 rows fetched
SQL>
Feito o teste acima podemos prosseguir para a próxima etapa que é a configuração do Database Gateway for ODBC. No diretório $ORACLE_HOME/hs/admin/ criaremos um arquivo chamado initMSSQL.ora com as configurações abaixo.
cat initDBLK_MSSQL.ora
HS_FDS_CONNECT_INFO = DBLK_MSSQL
HS_FDS_TRACE_LEVEL = off
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so
set ODBCINI= /etc/odbc.ini
Para esta conexão, será necessário a criação de um novo listener ou a alteração do atual. Afim de evitar qualquer impacto, eu optei pela criação de um novo listener chamado LISTENER_MSSQL, conforma abaixo.
LISTENER_MSSQL =
 (ADDRESS_LIST=
      (ADDRESS=(PROTOCOL=tcp)(HOST=lamim)(PORT=1522))
     (ADDRESS=(PROTOCOL=ipc)(KEY=PNPKEY))
)
SID_LIST_LISTENER_MSSQL=
  (SID_LIST=
      (SID_DESC=
         (SID_NAME=MSSQL)
         (ORACLE_HOME = /oracle/product/11.2.0/db)
         (PROGRAM=dg4odbc)
      )
  )
Após a criação do listener, precisamos configurar a entrada no TNS que chamaremos de MSSQL, conforme exemplo a seguir.
MSSQL =
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=tcp)(HOST=lamim)(PORT=1522))
      (CONNECT_DATA=(SID=MSSQL))
      (HS=OK)
    )
Feita a configuração do listener e do TNS, precisamos criar um dblink que usará o TNS criado para conectar-se ao SQL Server.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> create public database link MSSQL connect to "usuario" identified by "senha" using 'MSSQL';

Database link created.

SQL>  desc tabela@MSSQL;

 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 NUM                                       NOT NULL NUMBER(10)
 NUM_VERSAO_PROC                           NOT NULL NUMBER(10)
 COD_MARCA                                          NUMBER(10)
 COD_MODELO                                         NUMBER(10)
 ANO_MODELO                                         NUMBER(10)
 DIMENSAO                                           VARCHAR2(30)
Após realizadas as configurações acima é será possível acessar as tabelas do SQL Server usando o dblink MSSQL.

Fonte:
http://www.devmedia.com.br/acessando-outros-bancos-atraves-do-oracle-servicos-heterogeneos-hs-parte-01/13335
http://stackoverflow.com/questions/18531010/how-to-configure-microsoft-odbc-driver-11-for-sql-server-on-redhat-linux-with
http://www.databasejournal.com/features/oracle/article.php/3442661/Making-a-Connection-from-Oracle-to-SQL-Server.htm
Note.252364.1 Functional Differences Between Generic Connectivity and Database Gateways 
Note.232482.1 Gateway and Generic Connectivity Licensing Considerations

DOC DE APOIO: https://docs.microsoft.com/pt-br/sql/connect/odbc/linux-mac/installing-the-driver-manager

Comentários

  1. Eu consigo fazer consulta, mas queria saber como e possível efetuar um ddl uma trigger ou um creste?? Pode me ajudar
    Da um erro não e possível efetuar ddl acesso remoto, usuário não possui privilégios

    ResponderExcluir
    Respostas
    1. Boa Tarde Thomas,
      tudo bem?
      Caso ainda precise de algum apoio, podemos ajuda-lo. Basta acessar www.eximioti.com.br e abrir um atendimento sobdemanda.

      abraços.

      Excluir
  2. Boa Tarde, estou precisando executar uma procedure que encontra-se em um banco de dados SQL Server, como faço?

    ResponderExcluir
    Respostas
    1. Boa Tarde,
      Você já configurou a a conexão heterogênea?

      Excluir
    2. Boa Tarde Jhonata, o banco Oracle já tem todas as configurações com o SQLServer, preciso usar o Select mas executando uma procedure que está dentro do SQLServer. DECLARE
      Vproduto VARCHAR(20) ;
      Vlargura INTEGER ;
      Vcomprimento INTEGER ;
      Vcomposicao VARCHAR(40) ;
      Vresinaexternasn INTEGER ;
      Vresinainternasn INTEGER ;
      Vtipoentrega INTEGER ;
      Vcoderpcliente VARCHAR(30) ;
      Vcoderploja VARCHAR(30) ;
      Vcoderpclientetri VARCHAR(30) ;
      Vcoderplojatri VARCHAR(30) ;
      Vqtdpecasouconjuntos INTEGER ;
      SELECT *
      FROM DBO.dbo.fq_PreviaPedidos_InfoDataPossivel_Adami ("Vproduto", "Vlargura", "Vcomprimento",
      "Vcomposicao", "Vresinaexternasn", "Vresinainternasn", "Vtipoentrega", "Vcoderpcliente",
      "Vcoderploja","Vcoderpclientetri", "Vcoderplojatri", "Vqtdpecasouconjuntos")
      WHERE Vproduto VARCHAR(20) = "1081";
      AND Vlargura INTEGER = NULL;
      AND Vcomprimento INTEGER = NULL;
      AND Vcomposicao VARCHAR(40) = NULL;
      AND Vresinaexternasn INTEGER = NULL;
      AND Vresinainternasn INTEGER = NULL;
      AND Vtipoentrega INTEGER = 0;
      AND Vcoderpcliente VARCHAR(30) = "7741";
      AND Vcoderploja VARCHAR(30) = "1";
      AND Vcoderpclientetri VARCHAR(30) =NULL;
      AND Vcoderplojatri VARCHAR(30) = NULL;
      AND Vqtdpecasouconjuntos INTEGER = 10000;

      Excluir
  3. Esse é o original do SQL Server
    DECLARE @produto VARCHAR(20), -- Produto
    @largura INTEGER, @comprimento INTEGER, @composicao VARCHAR(40), @resinaexternasn INTEGER, @resinainternasn INTEGER, -- estes cinco campos são usados somente para pedidos de chapa, senão NULL
    @tipoentrega INTEGER, -- 0-CIF 1-FOB
    @coderpcliente VARCHAR(30),
    @coderploja VARCHAR(30),
    @coderpclientetri VARCHAR(30),
    @coderplojatri VARCHAR(30),
    @qtdpecasouconjuntos INTEGER -- Quantidade de peças/chapas/conjuntos para estimativa do tempo de produção;

    SET @produto = '10581'
    SET @largura = NULL SET @comprimento=NULL SET @composicao=NULL SET @resinaexternasn=NULL SET @resinainternasn=NULL
    SET @tipoentrega = 0
    SET @coderpcliente = '7741'
    SET @coderploja = '1'
    SET @coderpclientetri = NULL SET @coderplojatri=NULL
    SET @qtdpecasouconjuntos = 10000;

    SELECT *
    FROM dbo.fq_PreviaPedidos_InfoDataPossivel_Adami (@produto, @largura, @comprimento,
    @composicao, @resinaexternasn, @resinainternasn, @tipoentrega, @coderpcliente,
    @coderploja,@coderpclientetri, @coderplojatri, @qtdpecasouconjuntos)

    ResponderExcluir
    Respostas
    1. Você pode dar uma olhada na DOC: How To Call Function/procedures In The Linked SQL Server From Oracle Database (Doc ID 2362359.1).
      Caso tenha dificuldades, voce pode abrir uma solicitação de atendimento na Eximioti
      https://www.eximioti.com.br/sob-demanda

      abs

      Excluir
  4. ORA-28500: conexão do ORACLE com um sistema não Oracle retornou esta mensagem:
    [unixODBC][Driver Manager]Data source name not found, and no default driver specified {IM002}
    ORA-02063: precedendo 2 lines a partir de MYSSQL

    Sabe o que pode ser após realizar os passos acima ?

    O isql funciona perfeito

    isql -v MSSQL sqldev teste
    +---------------------------------------+
    | Connected! |
    | |
    | sql-statement |
    | help [tablename] |
    | quit |
    | |
    +---------------------------------------+
    SQL> quit

    ResponderExcluir

Postar um comentário