lunes, 8 de abril de 2013

ORA-02429

Leí este ejemplo aquí Luego decidí traducirlo para los hispanohablantes. Lo probé en Oracle 11.2.0.2.7. Es muy fácil crear y borrar un índice normal: 

SQL> conn andrew/reid
Connected.
SQL> alter session set nls_language = 'SPANISH'
  2  /

Sesion modificada.

SQL> create table andrews_table
  2  (andrews_column number)
  3  /

Tabla creada.

SQL> create index andrews_index on
  2  andrews_table(andrews_column)
  3  /

Indice creado.

SQL> drop index andrews_index
  2  /

Indice borrado.

SQL>

Pero si un índice sea creado automáticamente para ser empleado con un constraint, no se puede borrarlo. Para empezar, ponemos un constraint en nuestra tabla: 

SQL> alter table andrews_table
  2  add constraint andrews_constraint
  3  unique(andrews_column)
  4  /

Tabla modificada.

SQL>

Se puede ver el constraint en user_tables: 

SQL> select constraint_name
  2  from user_constraints
  3  where table_name = 'ANDREWS_TABLE'
  4  /

CONSTRAINT_NAME
------------------------------
ANDREWS_CONSTRAINT

SQL>

El constraint tiene un índice con el mismo nombre: 

SQL> select index_name
  2  from user_indexes
  3  where table_name = 'ANDREWS_TABLE'
  4  /

INDEX_NAME
------------------------------
ANDREWS_CONSTRAINT

SQL>

Pero no es posible borrarlo: 

SQL> drop index andrews_constraint
  2  /
drop index andrews_constraint
           *
ERROR en linea 1:
ORA-02429: no se puede borrar el indice utilizado para
aplicar la clave unica/primaria

SQL>

Para borrar el índice, es necesario borrar el propio constraint: 

SQL> alter table andrews_table
  2  drop constraint andrews_constraint
  3  /

Tabla modificada.

SQL>

Luego el  índice desaparece automáticamente y no es necesario borrarlo: 

SQL> drop index andrews_constraint
  2  /
drop index andrews_constraint
           *
ERROR en linea 1: ORA-01418: el indice especificado no existe

SQL>

2 comentarios: