Для этой операции параметр Ora-02069 global names должен иметь значение TRUE

Я искал несколько решений. Одним из них является следующее:

причина Требуется удаленное сопоставление оператора, но не может быть достигнуто, потому что global_names должно быть установлено в TRUE для его достижения

действие Выпуск alter session set global_names = true, если это возможно

но я не понимаю, почему мне нужно установить параметр global_names...Почему удаленное отображение параметр global_names? Пожалуйста, объясните мне.

P. S Я знаю, что при установке параметра global_names возникнут глобальные правила именования, что имя ссылки базы данных должно совпадать с именем удаленной базы данных..А также он добавляет доменное имя к имени базы данных, например . что еще?

3 ответов


ответ обсуждается здесь:http://dba010.wordpress.com/2011/01/05/oracle-errorsora/#ORA-02069

в случае, если ссылка не работает:

ошибка:

ORA-02069: параметр global_names должен быть установлен в TRUE для этой операции

причина:

вы пытаетесь сделать операцию DML на удаленной базе данных с помощью локальной функции.

это "ошибка Oracle", она должна работает, но не работает.

пример (для лучшего понимания):

–предположим, что у нас есть две базы данных DB1 и DB2

- на DB1 у нас есть функция fun1

create function fun1 return number is
begin
return 1;
end;

- на DB1 у нас есть ссылка на базу данных, относящуюся к DB2, называемой для простоты DB2.

–проверить, что он работает.

select *
from dual@DB2

–если выход следующий, то он работает.

DUMMY
-----
X

- создадим тестовую таблицу в DB2 (подключение к Базы данных DB2)

create table tesTable(
id         number,
testColumn number
);

–давайте сделаем некоторую операцию DML, которая должна вызвать эту ошибку ORA-02069.

insert into testable@DB2(id,testColumn)
values(1, fun1);



“ORA-02069: global_names parameter must be set to TRUE for this operation”

теперь, когда вы уже знаете, в какой ситуации эта ошибка возникает, давайте напишем решение. Он имеет два решения:

решение одно:

  1. установите для параметра global_names значение true, это можно сделать на системном уровне или уровне сеанса(учтите, что уровень сеанса иногда не доступно)

--на DB1

alter session set global_names=true;
  1. создайте ссылку базы данных на удаленной базе данных, в нашем случае на DB2, которая будет ссылаться на базу данных DB1 (сделайте имя ссылки таким же, как глобальное имя базы данных, потому что установка параметра global_names в true требует этого).

- на DB2

Create database link DB1 connect to <username> identified by <password>
using ‘DB1’;

теперь он должен работать, но я должен упомянуть, что создание ссылки на базу данных может быть не предпочтительнее,

потому что это не secure (вы должны догадаться, почему, потому что если вы это сделаете, вы сможете подключитесь к DB1 с некоторым пользователем через ссылку базы данных...если это не имеет значения для вас, используйте itJ).

решения два:

  1. создать временную таблицу в локальной базе данных.
  2. вставить строку во временную таблицу.
  3. вставьте временную строку из временной таблицы в удаленную базу данных.
  4. удалить временную строку. Заметить что это решение медленнее, чем первое. Но это также решает проблему и гораздо более безопасно.

ответ купы предлагает отличное объяснение и хорошие решения, однако, если вы не хотите или не можете следовать решению один или два там, я предлагаю проверить решение 2 здесь:http://dbtricks.com/?p=263.

Это сработало для меня, создав переменную и присвоив ей значение локальной функции, а затем используя переменную в инструкции sql, которая ссылается на удаленную таблицу.

надеюсь, это поможет кому-то, как это помогло мне!


цитирую этой теме:

...in the past Oracle used .world as a default domain if domain 
part was not specified in global db name, they changed it (I 
believe in 10g R1, but I'm not sure)