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.
Descompactar o driver da Microsoft baixado
[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.: 8Feito 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.gzApó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.iniPara 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 ConsiderationsDOC DE APOIO: https://docs.microsoft.com/pt-br/sql/connect/odbc/linux-mac/installing-the-driver-manager
Eu consigo fazer consulta, mas queria saber como e possível efetuar um ddl uma trigger ou um creste?? Pode me ajudar
ResponderExcluirDa um erro não e possível efetuar ddl acesso remoto, usuário não possui privilégios
Boa Tarde Thomas,
Excluirtudo bem?
Caso ainda precise de algum apoio, podemos ajuda-lo. Basta acessar www.eximioti.com.br e abrir um atendimento sobdemanda.
abraços.
Boa Tarde, estou precisando executar uma procedure que encontra-se em um banco de dados SQL Server, como faço?
ResponderExcluirBoa Tarde,
ExcluirVocê já configurou a a conexão heterogênea?
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
ExcluirVproduto 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;
Esse é o original do SQL Server
ResponderExcluirDECLARE @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)
Você pode dar uma olhada na DOC: How To Call Function/procedures In The Linked SQL Server From Oracle Database (Doc ID 2362359.1).
ExcluirCaso tenha dificuldades, voce pode abrir uma solicitação de atendimento na Eximioti
https://www.eximioti.com.br/sob-demanda
abs
Obrigado
ResponderExcluirORA-28500: conexão do ORACLE com um sistema não Oracle retornou esta mensagem:
ResponderExcluir[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