2009-06-11 56 views
10

Tengo dos esquemas diferentes en Oracle (digamos S1, S2) y dos tablas en esos esquemas (digamos S1.Table1, S2.Table2). Quiero consultar estas dos tablas desde el esquema S1.Consultar dos tablas desde un esquema diferente

Tanto S1 como S2 están en diferentes bases de datos. De DB1 - esquema S1, quiero hacer algo como esto,

select T1.Id 
    from S1.Table1 T1 
    , S2.Table2 T2 
Where T1.Id = T2.refId 

Yo sé una manera de hacer esto sería la creación de una base de datos de enlace para el segundo esquema y utilizarlo en la consulta. Tristemente, no tengo los privilegios necesarios para crear un enlace DB. ¿Hay alguna forma de hacer esto sin enlace DB? Por ejemplo, en TOAD puedes comparar dos objetos de esquema. Pero nuevamente, dos objetos de esquema y es una comparación general.

Cualquier idea, sugerencia es muy apreciada. Gracias por adelantado.

+0

¡Visite su DBA para obtener los privilegios! – tuinstoel

+0

Buena sugerencia. Como parece, solo visitarlo y obtener el certificado parece factible. – Guru

Respuesta

8

DB Links son más o menos el nombre del juego aquí. Si no puede obtener uno creado por su cuenta, entonces verifique si hay enlaces de DB públicos que pueda usar.

También es posible que sus DBA estén dispuestos a utilizar uno de sus enlaces de base de datos para crear una vista materializada de S2.Table2 en la instancia S1.

Otra opción podrían ser los servicios web, pero supongo que se encontraría con muchos más problemas administrativos que con un simple enlace de base de datos. Considere esos solo si hay buenas razones para no tener enlaces (ejemplo: dos organizaciones separadas que no desean abrir agujeros de firewall entre sus bases de datos).

Si fallas, te estás metiendo en un territorio realmente feo pero es posible que puedas hacer que algo funcione. Por ejemplo:

  • Abre ambos desde una herramienta que puede leer desde varias conexiones a la vez y realice la unión allí. Acceso. Sapo para el análisis de datos, lo que sea.
  • Utilice una herramienta como Toad para copiar S2.Table2 a su propio esquema ("crear en otro esquema" seguido de "copiar datos a otro esquema")
  • Si tiene, o puede obtener, objetos de directorio complementarios definidos en ambos servidores, cree una Vista materializada de S2 como una tabla externa en un directorio que se puede escribir desde S2 y leer desde S1.

Sin embargo, realmente no desea mantener ninguna de estas soluciones a largo plazo.

+0

Oye ... Muchas gracias. +1 por eso. Todavía estoy esperando marcarlo como una respuesta con la esperanza de obtener más sugerencias. – Guru

+0

Gracias por ese consejo. La eliminación de objetos personalizados es ahora más fácil. –

15

No necesitará un enlace de base de datos si los dos esquemas están en la misma base de datos.

Su consulta debería funcionar desde el esquema S1, siempre que a S1 se le haya otorgado el privilegio SELECCIONAR en S2.table2 (desde una cuenta dba o desde el esquema S2: GRANT SELECT ON S2.Table2 TO S1).

+0

Gracias, lo sé. Estos esquemas están en diferentes bases de datos. – Guru

+0

¡esta es la respuesta correcta! –

1

Utilice la instrucción CREATE DATABASE LINK para crear un enlace de base de datos. Un enlace de base de datos es un objeto de esquema en una base de datos que le permite acceder a objetos en otra base de datos.

un poco fuera de tema, pero es posible que desee utilizar la nueva sintaxis de combinación:

SELECT 
    T1.Id 
    FROM S1.Table1   T1 
     INNER JOIN S2.Table2 T2 ON T1.Id = T2.refId 

Todo condiciones de combinación aparecen en la posición "ON" cláusula y condiciones de filtro aparecen en el "dónde".

Este nuevo estilo hace que las uniones IZQUIERDA/DERECHA sean más fáciles de leer y entender. Además, no estoy tan familiarizado con Oracle (han pasado muchos años desde que trabajé en él), pero con SQL Server, he visto problemas cuando el antiguo estilo de unión y el nuevo estilo de combinación se mezclaron en una consulta con vistas .

+0

Gracias KM. pero, lamentablemente, no tengo experiencia para crear un enlace de DB y puede que no sea posible obtener la ayuda del DBA. Pensé que debería haber alguna manera de hacerlo. :( – Guru

+0

¿cómo podría el dba no ayudar, deberían estar ahí para ayudar a que tu proyecto funcione? –

+0

Es una actividad única. Y pensé que buscaría posibilidades antes de ir al DBA. Lo sé, siempre puedo hacerlo con Ayuda DBA. Gracias KM – Guru

1

Puede crear un proceso almacenado en java que se conecte a la otra base de datos y ejecute una selección en la otra base de datos a través de JDBC. El proceso almacenado de Java debe devolver una colección. Puede unirse a esta colección a través de un select from table(...) con la tabla en su propia base de datos.

Consulte here para obtener una solución similar.

Creo que este enfoque será lento y complicado porque tienes que hacer mucha codificación y tienes que crear un contenedor pl/sql para tu proceso Java almacenado.

Es mejor crear un enlace de base de datos.

+0

Gracias Tuinstoel. No estoy tan familiarizado con Java. Voy a ir en las líneas sugeridas por Steve a continuación. – Guru

1

No especifica si esta función es necesaria como parte del código de producción o si está intentando unir las dos tablas para realizar un análisis por única vez. Si es el último, puede usar Microsoft Access para crear un archivo mdb local que contenga tablas vinculadas a las dos bases de datos, luego escriba una consulta de acceso local que haga referencia a esas dos tablas. Luego puede usar ese mdb como fuente de datos para varias herramientas de informes.

Las consultas pueden no usar índices con la misma eficacia que un enlace de base de datos Oracle nativo, pero sería mejor que nada.

editar: No importa: veo que esto ya se sugirió anteriormente.

+0

Gracias Steve. De hecho estoy buscando en las líneas que sugirió. Es una actividad única. :) – Guru

Cuestiones relacionadas