Сатья верен в том смысле, что синтаксис CREATE DATABASE LINK
не позволяет создавать ссылку на базу данных в другой схеме. ОДНАКО ...
* 1007 Временное решение *
Можно IS создать ссылку на базу данных в схеме другого пользователя, если anotheruser
имеет привилегию CREATE DATABASE LINK
, а пользователь, к которому вы подключены, имеет привилегию CREATE ANY PROCEDURE
.
Вот обходной путь, который я использую:
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"
/
Давайте раскрутим это. Сначала я создаю процедуру в схеме anotherusers
; эта процедура содержит оператор CREATE DATABASE LINK
, который я хочу выполнить.
Когда процедура выполняется, она запускается как владелец процедуры, так что оператор CREATE DATABASE LINK
выполняется anotheruser
.
Название процедуры не важно, за исключением того, что мне нужно убедиться, что она не конфликтует с каким-либо существующим именем объекта. Я использую строчные буквы (заключая имя процедуры в двойные кавычки), используя «tmp», чтобы пометить этот объект как «временный», и используя текущий yyyymmddhh24miss в качестве части имени процедуры. (Я обычно запускаю запрос DBA_OBJECTS, чтобы проверить, что подходящее имя объекта не существует.)
Для функции администрирования «одноразового» типа это приемлемый обходной путь. Я предпочитаю это другой альтернативе: сохранение пароля другого пользователя, изменение пароля, подключение в качестве пользователя и сброс пароля другого пользователя обратно к сохраненному.)