El caso de la Reversión de las Fuentes Heterogéneas

Hace algún tiempo publique un artículo sobre como acceder a una base compatible con ODBC desde Oracle, sería bueno revisarlo antes de continuar con este.

En resumen, eso fue algo muy entretenido y realmente útil. Recuerdo que proteste por que el SQL Server 2005 Standard no me dejo hacerlo al revés, acceder a una base ODBC desde SQL Server, pues decía que solo la versión Empresarial permite hacerlo contra bases Oracle.

Un día decidí revisitar el problema, medio por deporte y medio por usar la utilidad BCP del SQL Server para extraer datos de Oracle, después de todo ya la usaba en otras varias exportaciones y me pareció adecuado hacer un estándar…

Que se necesita

  1. Un servidor Oracle (el mío es 8i, lo más fiel que un perro, más estable que la democracia Suiza)
  2. Un servidor SQL Server
  3. Los discos de cliente del Oracle, yo use los del 9i, son mucho más estables que los del 8i
  4. Una barra energética y/o chocolates
  5. Una novia, amiga, amigovia y/o fuente de inspiración (yo solía tener una rubia, chiquita y bonita)

Primero en el quipo de la base de datos SQL Server instalamos las herramientas de cliente del Oracle. El Oracle Universal Installer no es complicado ni nada molesto así pasamos a lo siguiente.

En el registro, en HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\MTxOCI actualizamos para que use los DLL que recién instalamos

Llave Valor
OracleOciLib oci.dll
OracleSqlLib orasql9.dll
OracleXaLib oraclient9.dll

Reiniciamos el equipo. Yo desconecte a 50 usuarios para esto. Como estaba de buen humor les advertí antes, claro que lo que hagan es cuestión de cada uno.

Luego usamos el Net Manager y configuramos el TNS hacia nuestro servidor Oracle, o más fácil en el directorio ORACLE_HOME\ network\ADMIN editamos el tnsnames.ora

BASEORACLE =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST =[SU SERVER ORACLE AQUI])(PORT = [PUERTO, GENERALMENTE 1521]))
)
(CONNECT_DATA =
(SERVICE_NAME = [NOMBRE DEL SERVICIO EN EL SERVER ORACLE])
)
)

Asi que ahora abrimos el SQL Server Management Studio, una ventana de query nueva y ponemos:

sp_droplinkedsrvlogin @rmtsrvname = BASEORACLE, @locallogin = null
EXEC sp_dropserver BASEORACLE

Esto borra cualquier vinculo existente, solo lo hacemos por precaución.

Claro que si tenían otro vínculo llamado BASEORACLE… lo acaban de echar a perder.

Entonces añadimos el servidor vinculado.

EXEC sp_addlinkedserver
@server= ' BASEORACLE ' /* NOMBRE DEL SERVER*/
, @provider='MSDAORA'
, @srvproduct='Oracle'
, @datasrc= ' BASEORACLE ' /* NOMBRE DEL TNS*/

Y se añade un login para ese server

EXEC sp_addlinkedsrvlogin
@rmtsrvname=' BASEORACLE '
, @useself='false'
, @rmtuser='system'  /* USUARIO */
, @rmtpassword='manager' /* CONTRASEÑA */

Claro que sería tonto de un DBA Oracle dejar la contraseña del usuario system como manager, incluso seria más sabio crear un usuario en la base Oracle para esto.

Luego, podemos probar el vínculo con una simple consulta:

exec sp_tables_ex @table_server = 'BASEORACLE ', @table_schema='ALGUNESQUEMA'

La parte fea es la ejecución de consultas, pues se hacen usando OPENQUERY

SELECT * FROM OPENQUERY(BASEORACLE, 'SELECT * FROM esquema.tabla ')

Pero para hacernos la vida más sencilla podemos hacer vistas de una sentencia de OPENQUERY

create view VISTA as
SELECT * FROM OPENQUERY(BASEORACLE, 'SELECT * FROM esquema.tabla ')

Para poder usar:
select * from VISTA

1 comment to El caso de la Reversión de las Fuentes Heterogéneas

Leave a Reply

Connect with Facebook

  

  

  

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>