В Oracle почему общедоступные синонимы становятся недействительными при удалении раздела таблицы
Может кто-нибудь сказать мне, почему происходит следующее поведение (Oracle 10.2):
SQL> create table part_test (
i int primary key,
d date
)
partition by range (d) (partition part_test_1 values less than (to_date(' 2 3 4 5 1980-01-01', 'yyyy-mm-dd')));
create public synonym part_test for part_test;
select object_name, object_type, status from all_objects where object_name = 'PART_TEST';
alter table part_test add partition part_test_2 values less than (to_date('1981-01-01', 'yyyy-mm-dd'));
select object_name, object_type, status from all_objects where object_name = 'PART_TEST';
alter table part_test drop partition part_test_1;
select object_name, object_type, status from all_objects where object_name = 'PART_TEST';
drop public synonym part_test;
drop table part_test;
Table created.
SQL> SQL>
Synonym created.
SQL> SQL>
OBJECT_NAME OBJECT_TYPE STATUS
------------------------------ ------------------- -------
PART_TEST TABLE VALID
PART_TEST TABLE PARTITION VALID
PART_TEST SYNONYM VALID
SQL> SQL>
Table altered.
SQL> SQL>
OBJECT_NAME OBJECT_TYPE STATUS
------------------------------ ------------------- -------
PART_TEST TABLE VALID
PART_TEST TABLE PARTITION VALID
PART_TEST TABLE PARTITION VALID
PART_TEST SYNONYM VALID
SQL> SQL>
Table altered.
SQL> SQL>
OBJECT_NAME OBJECT_TYPE STATUS
------------------------------ ------------------- -------
PART_TEST TABLE VALID
PART_TEST TABLE PARTITION VALID
PART_TEST SYNONYM INVALID
SQL> SQL>
Synonym dropped.
SQL>
Table dropped.
SQL>
Синоним становится недействительным после удаления разделов, и я не могу понять, почему.
Спасибо за любые мысли.
2 ответа
Я протестировал его с Oracle 10.2, и синоним становится действительно недействительным, но когда другой пользователь использует синоним, выполнив
выберите количество (*) из part_test;
Oracle автоматически компилирует синоним, и синоним становится действительным.
То же самое с пакетами, процедурами и функциями. Когда вы выполните их, и они недействительны, Oracle попытается скомпилировать их автоматически.
В версии 11.1.0.6 это не так. Это могла быть ошибка, которая была исправлена. Возможно, это было что-то, что было необходимо (например, для повторной проверки представления, основанного на синониме...), но там, где использовалась улучшенная техника.