Отключение и подключение FBI

alextim
Дата: 21.09.2004 19:58:50
У меня на таблице имеется FBI индекс. В базе определена функция для этого FBI индекса.

Если я хочу добавить колонку в таблицу, то получаю следующую ошибку:
ORA-04020: deadlock detected while trying to lock object

Можно ли каким-то образом временно отключить индекс, добавить колонку и подключить его снова.

Команды: alter index <index_name> disable
alter index <index_name> unused
к желаемому результату не приводят...

После удаления индекса, колонка добовляется и ошибка не появляется.
SY
Дата: 21.09.2004 20:36:51
Most likely FBI function self references %TYPE or %ROWTYPE. For example:

SQL> create table tbl(x number);

Table created.

SQL> create or replace
2 function f_tbl(p_num number)
3 return number deterministic
4 is
5 v_x tbl.x%type;
6 begin
7 return p_num;
8 end;
9 /

Function created.

SQL> create index tbl_idx on tbl(f_tbl(x));

Index created.

SQL> alter table tbl add y number;
alter table tbl add y number
*
ERROR at line 1:
ORA-04020: deadlock detected while trying to lock object SCOTT.TBL


SQL>


alter table tbl will put a lock on TBL. It also invalidates function f_tbl, since function is referencing tbl.x%type and therefore depends on table tbl. This invalidated index tbl_idx which forces oracle to recompile it, which, in its turn, forces oracle to recompile the function. And since table is locked we have a deadlock. If this is the case, you need to replace %type references to specific datatype. It function is issuing DML against TBL, you have no other choice but drop FBI before any DDL against the table. Essentially, it is a bug since deadlock is within recursive sql and oracle should not deadlock itself.

SY.