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).
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