2009-06-12 14 views
5

La sintaxis típica para la creación de un enlace db es el siguiente:Oracle sintaxis para crear la base de datos Enlace pertenece a otro usuario

create database link remote_db_link 
connect to remote_user 
identified by remote_password 
using 'remote_db' 

pero me gustaría que mi enlace DB propiedad de otra cuenta después de que se creó. ¿Hay alguna forma de hacer esto?

El siguiente no funciona:

create database link anotheruser.remote_db_link 
connect to remote_user 
identified by remote_password 
using 'remote_db' 
+0

La respuesta "seleccionada" dice "no se puede crear un enlace de base de datos en el esquema de otro usuario". Esto no es exactamente cierto. HAY "sintaxis de Oracle" que puede lograr esto. Ver mi respuesta – spencer7593

Respuesta

8

Restrictions on DBLinks - No se puede crear un enlace de base de datos en el esquema de otro usuario, y no se puede calificar dblink con el nombre de un esquema.

+0

:-(Tenía miedo de eso. Gracias a todos por su tiempo. – Jeff

+0

En realidad, es posible crear un enlace de base de datos en el esquema de otro usuario. – spencer7593

13

Sathya tiene razón, ya que la sintaxis CREATE DATABASE LINK no permite crear un enlace de base de datos en otro esquema. Sin embargo ...

Solución

Se ES posible crear un enlace de base de datos en el esquema de otro usuario, siempre y cuando anotheruser tiene CREATE DATABASE LINK privilegio, y el usuario está conectado al igual que CREATE ANY PROCEDURE privilegio.

Aquí está la solución que utilizo:

 
    create procedure anotheruser."tmp_doit_200906121431" 
    is 
    begin 
     execute immediate ' 
     create database link remote_db_link 
     connect to remote_user 
     identified by remote_password 
     using ''remote_db'' '; 
    end; 
    /
    begin 
     anotheruser."tmp_doit_200906121431"; 
    end; 
    /
    drop procedure anotheruser."tmp_doit_200906121431" 
    /

Vamos a desenrollar eso. Primero, creo un procedimiento en el esquema anotherusers; este procedimiento contiene la declaración CREATE DATABASE LINK que quiero ejecutar.

Cuando se ejecuta el procedimiento, se ejecuta como el propietario del procedimiento, de modo que la instrucción CREATE DATABASE LINK se ejecuta mediante anotheruser.

El nombre del procedimiento no es importante, excepto que necesito asegurarme de que no entre en conflicto con ningún nombre de objeto existente. Uso letras minúsculas (adjuntando el nombre del procedimiento entre comillas dobles), usando "tmp" para marcar este objeto como "temporal", y usando el actual aaaammddhh24miss como la parte del nombre del procedimiento. (Por lo general, ejecuto una consulta de DBA_OBJECTS para verificar que no coincida un nombre_objeto correspondiente)

Para una función de administrador de tipo "único", esta es una solución viable. Prefiero esto a la otra alternativa: guardar la contraseña del otro usuario, cambiar la contraseña, conectar como usuario y restablecer la contraseña de otro usuario a la guardada).

+0

Guau, gran solución ... Muchas gracias !!! – kupa

+0

Estás ¡el jefe! –

-2

Como usuario sys, puede ver todos los enlaces db en SYS.DBA_DB_LINKS ver. Esa vista utiliza el enlace $ y el usuario $ table. Puede crear un nuevo dblink como habitualmente y se muestra en el enlace $ table. Luego cambie de propietario (use id del usuario $). cometer. Hecho.

+0

Gracias por responder pero esta pregunta ya tiene una respuesta aceptada. – alestanis

+0

Tenga en cuenta que el enfoque descrito en esta respuesta * no * es compatible con Oracle.Oracle recomienda enérgicamente no emitir DML para modificar el contenido de las tablas en el esquema SYS, excepto bajo la dirección del soporte de Oracle. – spencer7593

Cuestiones relacionadas