ORA-38818: недопустимая ссылка на изданный объект user1.v1 - PullRequest
0 голосов
/ 30 ноября 2018

Я видел какое-то странное поведение и пытался повторить с помощью простого и глупого кода.Это о создании синонимов.У меня есть сценарий Oracle 11g:

begin
  execute immediate 'drop view user1.v1';
exception
  when others then
    null;
end;
/
begin
  execute immediate 'drop view user1.v2';
exception
  when others then
    null;
end;
/
begin
  execute immediate 'drop public synonym v1';
exception
  when others then
    null;
end;
/
begin
  execute immediate 'drop public synonym v2';
exception
  when others then
    null;
end;

В приведенном выше фрагменте предполагается удалить любой связанный объект.Чтобы гарантировать это, я запросил select o.* from all_objects o where o.object_name = 'V1' or o.object_name = 'V2' (давайте назовем этот запрос Q1), и он ничего не возвратил, хорошо.Затем я запустил это:

create or replace force view user1.v1 as
  select * from dual;
create or replace force view user1.v2 as
  select v1.dummy || '2' as new_dummy from v1;

Используя Q1, я получил два правильных представления, как и должно быть.Я проверил select * from v1,v2 (Q2), чтобы проверить.Это тоже было нормально.

Но все это было зарегистрировано как пользователь user1, попытка Q2 с user2, очевидно, вернула ORA-00942: table or view does not exist.Затем я хотел создать для него синонимы:

begin
  execute immediate 'create public synonym v1 for user1.v1';
end;
/
begin
  execute immediate 'create public synonym v2 for user1.v2';
end;

Я хотел удалить любой объект или синоним, связанный с v1 и v2, затем создать их, протестировать их и, наконец, создать некоторые общедоступные синонимы для глобальныхиспользование.После их создания я получил ошибку в заголовке.Я сделал select * from dba_users и увидел, что user1 имеет EDITIONS_ENABLED как Y.Все это прекрасно работало у разработчиков других баз данных.Что я могу настроить, чтобы добиться этого?

...