<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>código, locura y poesía &#187; HS</title>
	<atom:link href="http://daniel.ec/tag/hs/feed/" rel="self" type="application/rss+xml" />
	<link>http://daniel.ec</link>
	<description>O las aventuras románticas, poéticas e ideológicas de un complicado programador.</description>
	<lastBuildDate>Thu, 29 Jul 2010 22:06:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>El caso de las Fuentes Heterogéneas</title>
		<link>http://daniel.ec/2007/12/06/el-caso-de-las-fuentes-heterogeneas/</link>
		<comments>http://daniel.ec/2007/12/06/el-caso-de-las-fuentes-heterogeneas/#comments</comments>
		<pubDate>Thu, 06 Dec 2007 22:37:54 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Código]]></category>
		<category><![CDATA[HS]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://danmarce.newsit.es/?p=9</guid>
		<description><![CDATA[.¿Alguna vez han necesitado pasar información entre dos DBMS? En mi trabajo tengo una base de datos SQL Server 2005 y otra Oracle 8i (ambas en versión Estándar). Para pasar información de una a otra usamos archivos como intermediarios. No es divertido ni fácil programar para eso, las validaciones son ridículamente complicadas en Oracle Developer, [...]]]></description>
			<content:encoded><![CDATA[<p>.¿Alguna vez han necesitado pasar información entre dos DBMS?</p>
<p>En mi trabajo tengo una base de datos SQL Server 2005 y otra Oracle 8i (ambas en versión Estándar). Para pasar información de una a otra usamos archivos como intermediarios. No es divertido ni fácil programar para eso, las validaciones son ridículamente complicadas en Oracle Developer, aunque el <a title="EN: PL/SQL" href="http://en.wikipedia.org/wiki/PL_SQL">PL/SQL</a> deja escribir código bellamente estructurado y con buen manejo de excepciones, es largo validarlas todas…</p>
<p><span id="more-11"></span>Entonces se me ocurrió probar los vínculos de base de datos del SQL Server, que supuestamente son sencillos. Como en realidad no lo conozco más que lo suficiente de este, seguí alegremente los pasos del asistente (e instale las herramientas de cliente del Oracle 9i, ese es mi dominio). Muy simple, se configura la distribución de datos, luego se crea el vínculo. ¿Qué? Es directo contra mi base Oracle. Fantástico.</p>
<p>Luego al hacer clic en &#8220;Finalizar&#8221;, acabo mi alegría.  Después de hacer todo, después de haber configurado todo, me advirtió que solo la versión Empresarial del SQL Server permite acceder a bases de Datos Oracle. <span style="text-decoration: line-through;">Un fiasco total. </span>(<a href="http://daniel.ec/2009/03/10/el-caso-de-la-reversion-de-las-fuentes-heterogeneas/">Ver acá la solución</a>)</p>
<p>Con esa decepción decidí buscar una solución del lado de mi base Oracle, quizás debí hacerlo desde el inicio pero caí en la tentación de los asistentes de Siguiente-Siguiente-Finalizar de Microsoft.</p>
<p>En Oracle la solución más barata se llama <a title="EN: Oracle Database Heterogeneous Connectivity Administrator's Guide" href="http://download-uk.oracle.com/docs/cd/B14117_01/server.101/b10764.pdf">Fuentes Heterogéneas</a>. Esta no solo permite acceder datos de SQL Server sino de cualquier base de datos que tenga ODBC (muchas, desde Access). Pero en Oracle NADA INTERESANTE es Siguiente-Siguiente-Finalizar (Salvo la instalación y la creación de una instancia). No hay mucha documentación en línea y no sabía dónde quedaron los libros (además eran de la versión 7 en UNIX). Así que usando la instancia de pruebas me lance al ruedo.</p>
<p>Me tomo algunas horas, sobre todo porque mi estado anímico no es del todo adecuado para algo así. Aquí les detallo los pasos, para hacer lo que yo hice, para que se ayuden si necesitan hacerlo.</p>
<p><strong>Nota:</strong><br />
Luego de más pruebas y practicas he refinado este tutorial, ahora es algo mas simple.</p>
<h2>Que necesitas</h2>
<ol>
<li>Una Maquina Windows (se puede usar otro SO, mientras tenga los controladores ODBC, que es complicado)</li>
<li>El Disco Instalador de la base por si las dudas.</li>
<li>Los Controladores <a title="ES: ODBC" href="http://es.wikipedia.org/wiki/ODBC">ODBC </a>se la base que quieres acceder.</li>
<li>Una instancia de Oracle Funcionando.</li>
<li>Golosinas.</li>
<li>Vida social, si estás leyendo esto <span style="text-decoration: line-through;">o peor escribiéndolo</span>, ese un mal síntoma.</li>
</ol>
<h2>Servidor 1, de la Fuente Heterogénea (Windows + Oracle + ODBC)</h2>
<h3>Configurar el DSN</h3>
<p>En el Panel de Control, Herramientas Administrativas, Orígenes de Datos ODBC, configuramos un <a title="ES:DSN" href="http://es.wikipedia.org/wiki/DSN">DSN </a>de sistema. No importa el sabor, solo importa configurarlo bien y probarlo. También he notado que es mejor seleccionar una Base de Datos predeterminada, para este ejemplo le puse el nombre DSN_LINK.</p>
<p>Además para SQL Server lo mejor es crear o usar autenticación del servidor y no la de Windows (A menos que tu servidor Oracle este bien configurado para esto y tu dominio Windows NT también lo esté)</p>
<p>En esta máquina debe estar instalada una instancia de la base de datos, no basta con las herramientas de cliente. Si no conocen como esta su licenciamiento es mejor que sea la misma máquina del servidor principal (Que para poder usar ODBC tiene que ser Windows <a title="ES: Risa Malvada" href="http://inciclopedia.wikia.com/wiki/Risa_malvada">MUAHAHAHAHAHAHA</a>)</p>
<h3>Preparar la Instancia</h3>
<p>Como primer paso recomiendo desactivar los nombres globales para hacer la vida más placentera:</p>
<p><code>alter system set global_names=false;</code></p>
<p>Y se deben crear los objetos para el vínculo heterogéneo, afortunadamente podemos ejecutar este archivo (debe hacerse como el usuario &#8220;internal&#8221;):</p>
<p><code>ORACLE_HOME\rdbms\admin\caths.sql</code></p>
<p><code>ORACLE_HOME</code> se refiere al directorio en donde está instalada la base, ¿obvio no?</p>
<h3>Preparar el nuevo Listener</h3>
<p>Ahora se sebe preparar el nuevo servicio de escucha para la funciona de fuente heterogénea, editando el archivo <code>ORACLE_HOME\network\ADMIN\LISTENER.ORA</code> se le añade algo así:</p>
<p><code><br />
LISTENER =<br />
(DESCRIPTION_LIST =<br />
(DESCRIPTION =<br />
(ADDRESS = (PROTOCOL = TCP)(HOST = <strong>[Nombre o IP del SERVIDOR]</strong>)(PORT = <strong>[Puerto]</strong>))<br />
)<br />
)<br />
SID_LIST_LISTENER =<br />
(SID_LIST =<br />
(SID_DESC=<br />
(SID_NAME=FHLISTENER)<br />
(ORACLE_HOME = <strong> [SU DIRECTORIO DE ORACLE_HOME AQUI, TIPO C:\ORACLE]</strong>)<br />
(PROGRAM=hsodbc)<br />
)<br />
)</code></p>
<p>Deben notar algunas cosas, primero el puesto, la base Oracle normalmente usa el 1521, además si hacemos esto en el mismo servidor de nuestra base solo hay que añadir el servicio, así en <code>SID_LIST</code>:</p>
<p><code><br />
(SID_DESC=<br />
(SID_NAME=FHLISTENER)<br />
(ORACLE_HOME =  <strong>[SU DIRECTORIO DE ORACLE_HOME AQUI, TIPO C:\ORACLE]</strong>)<br />
(PROGRAM=hsodbc)<br />
)<br />
</code></p>
<p>También debe notarse que es importante configurar el <code>ORACLE_HOME</code>.</p>
<p>Guardamos los cambios.</p>
<h3>Configurar la fuente Heterogénea</h3>
<p>El servicio se configura creando el archivo <code>initFHLISTENER.ora</code> (<strong>init + el nombre del listener)</strong> en el directorio <code>ORACLE_HOME\hs\admin</code>. <code>HS_FDS_CONNECT_INFO</code> guarda el nombre del DSN, <code>HS_DB_NAME</code> guarda el nombre de la base de datos predeterminada, general un archivo básico solo tendría estas líneas:</p>
<p><code>HS_FDS_CONNECT_INFO = <span style="text-decoration: underline;"><strong>DSN_LINK</strong></span><br />
HS_FDS_TRACE_LEVEL = off<br />
HS_DB_NAME= <span style="text-decoration: underline;"><strong>[BASE DE DATOS PREDETERMINADA]<br />
</strong></span></code></p>
<p>Me dio mejores resultados al poner un nombre para la base de datos predeterminada. Con esto listo reiniciamos el servicio de escucha…</p>
<h2>Servidor 2, de la Base de Datos Oracle (Cualquier SO + Oracle)</h2>
<h3>Configurar el TNS en el servidor Oracle</h3>
<p>Antes a que no sabías que TNS es acrónimo de Transparent Network Substrate, y uno configurando algo con un nombre tan <span style="text-decoration: line-through;">geek</span> interesante. El archivo de configuración de los TNS lo encuentras en: <code>ORACLE_HOME\network\ADMIN\ TNSNAMES.ORA</code></p>
<p><code><span style="text-decoration: underline;"><strong>NOMBREDELTNS</strong></span> =<br />
(DESCRIPTION=<br />
(ADDRESS=(PROTOCOL=tcp)(HOST=<span style="text-decoration: underline;"><strong>[Nombre o IP del servidor DSN]</strong></span>)(PORT=<span style="text-decoration: underline;"><strong>[EL puerto del servicio, eg. 1521]</strong></span>))<br />
(CONNECT_DATA=(SID=FHLISTENER))<br />
(HS=OK)<br />
)<br />
</code></p>
<p>Unas aclaraciones. Nótese el <code><strong>HS=OK</strong></code> para este TSN en particular, adicionalmente este servidor no necesariamente tienen que estar una maquina Windows, ya que usa el TSN nativo de Oracle para conectarse.</p>
<h3>Crear el Vínculo</h3>
<p>En el servidor Oracle todo es tan simple como usar esta instrucción para conectar todo:</p>
<p><code>CREATE DATABASE LINK <span style="text-decoration: underline;"><strong>sql_link</strong></span> CONNECT TO <span style="text-decoration: underline;"><strong>"USUARIO SQL SERVER"</strong></span> IDENTIFIED BY <span style="text-decoration: underline;"><strong>"CONTASEÑA"</strong></span> USING <span style="text-decoration: underline;"><strong>' NOMBREDELTNS'</strong></span>;</code></p>
<p>Es importante notar el nombre de usuario y la contraseña. Esto suponiendo que uso la autenticación de SQL Server. Además <strong>NO RECOMIENDO USAR EL USUARIO SA</strong>, aunque este viene desactivado en SQL Server 2005. Es mejor crear un usuario para esto.</p>
<p>Si quieren librarse del vínculo pueden usar:</p>
<p><code>DROP DATABASE LINK <span style="text-decoration: underline;"><strong>sql_link<br />
</strong></span></code></p>
<p>Un ejemplo de consulta sencilla:</p>
<p><code>SELECT * FROM <span style="text-decoration: underline;"><strong>tabla</strong></span>@<span style="text-decoration: underline;"><strong>sql_link<br />
</strong></span></code></p>
<p>Hay que recordar que los nombres de las tablas no existen en nuestra base Oracle, si queremos seleccionar ciertas columnas, o usar una clausula Where se deben poner los nombres entre comillas:</p>
<p><code>SELECT <span style="text-decoration: underline;"><strong>"columna1", "columna2"</strong></span> FROM <span style="text-decoration: underline;"><strong>tabla</strong></span>@<span style="text-decoration: underline;"><strong>sql_link </strong></span>where <span style="text-decoration: underline;"><strong>"columna1" </strong></span>= <span style="text-decoration: underline;"><strong>condición</strong></span></code></p>
<p>Incluso la vida puede ser mucho mas simple usando <code>CREATE SYNONYM.</code></p>
<h3>Notas para usar con Oracle Developer 6i</h3>
<p>Oracle Developer está diseñado para acceder a los datos de una base Oracle, no de un vinculo de fuentes heterogéneas, no a menos que se lo engañe <img src='http://daniel.ec/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Primero se crea una vista, esto hace que el Bloque de Datos en Developer sea de solo lectura, pero lo demás se puede compensar en Triggers, además mi objetivo inicial era este.</p>
<p><code>CREATE OR REPLACE VIEW vista<br />
("ROWID", <span style="text-decoration: underline;"><strong>columna1, columna2</strong></span>)<br />
AS<br />
SELECT ROWNUM, <span style="text-decoration: underline;"><strong>"columna1", "columna2"</strong></span> FROM <strong><span style="text-decoration: underline;">tabla@sql_link</span></strong>;</code></p>
<p>No olvidar los permisos (en modo absoluto y no recomendable para todos):</p>
<p><code>GRANT ALL ON vista TO PUBLIC;</code></p>
<p>Esto es porque Developer necesita la columna ROWID, pero la fuente heterogénea no la proporciona. En ese momento se me ocurrió crear una vista de la fuente. Funciona porque tomo la columna ROWNUM y la renombro como ROWID en la vista, el truco es poner ROWID entre comillas.</p>
<p>Con eso puedo ver los datos de SQL Server directamente en Oracle Forms, procesarlos, realizar importaciones y incluso usar el Reports contra SQL Server.</p>
<h3>Nota de Descarga</h3>
<p>Como todo, este post se proporciona como referencia, tal cual como es. No me culpen si rompen algún servidor, aunque si lo hacen quizás pueda ayudar.</p>
<blockquote><p>¿Si no es un juego para ella?</p>
<p>¿Y si sintiera algo por más mi?</p>
<p>¿Acaso yo no tengo miedo de eso?</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://daniel.ec/2007/12/06/el-caso-de-las-fuentes-heterogeneas/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
