Archivo por meses: enero 2017

Borrar clave primaria junto con indice en oracle

Hace un par de días experimente un problema borrando una clave primaria de una tabla. Mi objetivo era agregar una nueva columna a la tabla y re definir la clave primaria y el indice básico de la tabla.

El problema fue que al eliminar la clave primaria, el indice no se borraba en conjunto con ella como es común, sino que por el contrario solo se eliminaba la clave primaria y el indice atado a ella quedaba ahí. Ésto me producía un conflicto posterior en el script, pues al crear la clave primaria con el antiguo nombre, me arrojaba error puesto que el objeto con ese nombre “ya existía”. En efecto… Pues el indice aun estaba ahí.

Porque sucede?
Sucede cuando el indice de una clave primaria no es creado al mismo tiempo que ésta misma. Entonces, cuando se borra la clave primaria oracle asume que el indice no se debe tocar.

Como solucionarlo?
Fácil, solamente verifica después de borrar la clave primaria que el indice ha sido eliminado también. Podrías usar algo como lo siguiente:

begin
select ‘S’
into vExiste
from SYS.dba_objects
where OBJECT_TYPE = ‘INDEX’
and upper(OBJECT_NAME) = ‘NOMBRE_DEL_INDICE’;
exception
when others then
vExiste := ‘N’;
end;

if (vExiste = ‘S’) then
EXECUTE IMMEDIATE ‘DROP INDEX NOMBRE_DEL_INDICE’;
end if;

Fuente:
http://www.vertabelo.com/blog/technical-articles/why-does-oracle-sometimes-not-drop-an-index-associated-with-a-primary-key-or-unique-constraint