Как использовать синоним DBlink в Oracle?

Я создал синоним для dblink.

create synonym dblink2 for dblink1

Но когда я запрашиваю что-либо, используя синоним вместо dblink, я получаю сообщение об ошибке описание соединения для удаленной базы данных не найдено.

SELECT * FROM DUAL@DBLINK2

Как выполнить запрос с использованием синонима?

Изменить: я знаю, что это сработает, если я создам представление таблицы с помощью dblink. Но мое требование заключается в вышеуказанном вопросе.


person Nitish    schedule 01.12.2015    source источник
comment
Было бы разумнее создать синоним для таблиц в удаленной базе данных, а не синоним для самого dblink. Например: create synonym dual_dblink2 for dual@dblink1   -  person Boneist    schedule 01.12.2015
comment
Не вижу смысла создавать синоним для самого dblink. В идеале вы создаете синоним для удаленной таблицы, используя dblink.   -  person Lalit Kumar B    schedule 01.12.2015
comment
100 столов. Невозможно создать 100 синонимов.   -  person Nitish    schedule 01.12.2015
comment
Вы не можете на самом деле сделать то, что вы просите. Почему вы хотите это сделать? Кажется, нет очевидного преимущества перед созданием db_link с другим именем, которое указывает на то же самое место, и даже это кажется странным требованием. Если вы немного объясните, почему вам это нужно, кто-то может предложить альтернативное решение, которое будет работать так же хорошо.   -  person    schedule 04.12.2015
comment
В чем именно ваша проблема с синонимом 100? Я имею в виду, вас беспокоит количество объектов или только время, необходимое для их создания?   -  person Gergely Bacso    schedule 08.12.2015
comment
@Nitish, практически нет ограничений на количество синонимов, которые вы можете определить в базе данных. Если в вашей базе данных 100 таблиц, ничто не мешает вам создать 100 синонимов.   -  person Jeffrey Kemp    schedule 09.12.2015


Ответы (5)


К сожалению, создание синонимов для dblink не поддерживается. Если вы прочитаете документацию по синонимам, вы найдете что разрешенными объектами для синонимов являются только:

Используйте оператор CREATE SYNONYM для создания синонима, который является альтернативным именем таблицы, представления, последовательности, процедуры, хранимой функции, пакета, материализованного представления, объекта схемы класса Java, пользовательского типа объекта или другого синонима. .

Причина, по которой ваш второй запрос не работает, заключается в том, что созданный вами синоним работает неправильно. Он не проверяется должным образом во время создания, и вы можете создавать любые неправильные синонимы, подобные этому. Чтобы проверить, просто проверьте следующее утверждение:

create synonym dblink3 for no_object_with_this_name;

Вы все равно получите такой ответ:

*Synonym DBLINK3 created.*

Но, конечно, через этот синоним ничего работать не будет.

person Gergely Bacso    schedule 03.12.2015
comment
Мой ответ не показывает, что это возможно. Мой ответ только показывает, что вы можете успешно выполнить оператор, который создает у вас впечатление, что вы его создали. Я добавил эту часть, чтобы указать, почему @Nitish выглядит возможным. Я догадался, что он наверняка заинтересуется этим. - person Gergely Bacso; 04.12.2015
comment
Так почему же Oracle разрешает такую ​​функцию? Разве не должно быть подтверждения? Есть ли какое-то преимущество в наличии этой функции? - person Nitish; 08.12.2015
comment
На самом деле это не фича, а дизайнерское решение. Oracle на самом деле не проверяет создание синонима во время компиляции. Я думаю, это имеет смысл, поскольку он может стать недействительным даже после того, как он был успешно создан. Представьте, что у вас есть синоним, указывающий на таблицу в удаленной базе данных через dblink. ТОГДА эта таблица сбрасывается. У удаленной базы данных нет простого способа заблокировать это, поэтому существующий синоним становится недействительным. Это было бы хорошей причиной для проверки синонимов во время доступа. - person Gergely Bacso; 08.12.2015

Не вижу смысла создавать синоним для самого dblink. В идеале вы создаете синоним для удаленной таблицы, используя dblink.

CREATE DATABASE LINK my_db_link CONNECT TO user IDENTIFIED BY passwd USING 'alias';
CREATE SYNONYM my_table FOR remote_table@my_db_link;

Теперь вы можете запросить удаленную таблицу, используя синоним:

SELECT * FROM my_table;
person Lalit Kumar B    schedule 01.12.2015

Я пытаюсь думать о бизнес-проблеме, которая решается путем добавления синонима к db_link, и единственное, о чем я могу думать, это то, что вам нужно развернуть постоянный код, который будет выбирать из some_Table@some_dblink, и хотя таблица имена постоянны, разные пользователи могут просматривать разные db_links. Или вы просто хотите иметь возможность поменять местами, с какой db_link вы работаете, с помощью простого синонима repoint.

Вот в чем проблема: так нельзя. Синонимы db_link не допускаются.

Ваше единственное решение состоит в том, чтобы вместо этого код ссылался на таблицы по синонимам и устанавливал частные синонимы так, чтобы они указывали на правильный db_link. Таким образом, ваш код продолжает «Выбрать из REMOTE_TABLE1», и вы просто можете изменить, из какой DB_LINK вы получаете эту удаленную таблицу.

Утомительно ли устанавливать/сбрасывать более 100 частных синонимов? Ага. Но если это то, что вам нужно делать часто, тогда свяжите процедуру, которая сделает это за вас, где вы передаете имя db_link, и оно циклически проходит и сбрасывает синонимы для вас.

person Michael Broughton    schedule 04.12.2015

Если вы пытаетесь сделать ссылку на БД доступной для нескольких схем (пользователей), ответом будет создание общедоступной ссылки на БД.

пример:

CREATE PUBLIC DATABASE LINK dblink1 CONNECT TO user IDENTIFIED BY password USING 'tnsalias';

После этого любая схема может выдать:

SELECT * FROM TABLE@dblink1
person Olafur Tryggvason    schedule 03.12.2015

Хотя я понимаю, что этому вопросу уже более 3 лет, кому-то может быть полезен другой ответ в будущем.

Давайте представим, что у меня есть 4 базы данных, 2 для производства и 2 для разработки/тестирования.

Prod DB: PRDAPP1DB1 и PRDAPP2DB1 Dev DB: DEVAPP1DB1 и DEVAPP2DB1

Базы данных "APP2" выполняют процедуры для извлечения и импорта данных из баз данных APP1. В этих процедурах есть различные операторы выбора, такие как:

declare
iCount INTEGER;
begin
  insert into tbl_impdata1
  select sysdate, col1, col2, substr(col3,1,10), substr(col3,15,3)
  from tbl1@dblink2; -- Where dblink2 points to DEVAPP1DB1
  ...
  <more statements here>
  ...
EXCEPTION
  <exception handling code here>
end;

Теперь это нормально для разработки, но dblink2 необходимо постоянно менять на dblink1 при развертывании обновленной процедуры в рабочей среде.

Как было указано, для этой цели нельзя использовать синонимы. Но вместо этого создайте ссылки БД с тем же именем и другой строкой подключения.

Например. на производстве:

CREATE DATABASE LINK "MyDBLINK" USING 'PRDAPP1DB1';

И на разработчике:

CREATE DATABASE LINK "MyDBLINK" USING 'DEVAPP1DB1';

А потом в процедурах поменять все "@dblink1" и "@dblink2" на "@mydblink" и оттуда все должно быть прозрачно.

person Peter T.    schedule 28.02.2019