Для этой операции параметр 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”
теперь, когда вы уже знаете, в какой ситуации эта ошибка возникает, давайте напишем решение. Он имеет два решения:
решение одно:
- установите для параметра global_names значение true, это можно сделать на системном уровне или уровне сеанса(учтите, что уровень сеанса иногда не доступно)
--на DB1
alter session set global_names=true;
- создайте ссылку базы данных на удаленной базе данных, в нашем случае на DB2, которая будет ссылаться на базу данных DB1 (сделайте имя ссылки таким же, как глобальное имя базы данных, потому что установка параметра global_names в true требует этого).
- на DB2
Create database link DB1 connect to <username> identified by <password>
using ‘DB1’;
теперь он должен работать, но я должен упомянуть, что создание ссылки на базу данных может быть не предпочтительнее,
потому что это не secure (вы должны догадаться, почему, потому что если вы это сделаете, вы сможете подключитесь к DB1 с некоторым пользователем через ссылку базы данных...если это не имеет значения для вас, используйте itJ).
решения два:
- создать временную таблицу в локальной базе данных.
- вставить строку во временную таблицу.
- вставьте временную строку из временной таблицы в удаленную базу данных.
- удалить временную строку. Заметить что это решение медленнее, чем первое. Но это также решает проблему и гораздо более безопасно.
ответ купы предлагает отличное объяснение и хорошие решения, однако, если вы не хотите или не можете следовать решению один или два там, я предлагаю проверить решение 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)