2015-12-01 1 views
2

J'ai créé une vue matérialisée avec un rafraîchissement rapide. Il a une clé primaire (avec using index) que je veux modifier. J'ai couru la déclaration suivante dans sqlplus:Suppression de la clé primaire d'une vue matérialisée mais impossible de la recréer - pourquoi?

SQL> alter table 
    2   MV 
    3  drop constraint PK_MV; 

Table altered. 

SQL> alter table 
    2   MV 
    3  add constraint PK_MV primary key 
    4   (
    5   A_ID 
    6   , B_ID 
    7   ) 
    8   using index 
    9   tablespace IDX; 
    alter table 
* 
ERROR in line 1: 
ORA-00955: name is already being used by existing object 

Il semble que la PK_MV clé primaire existe encore. Cependant, n'est-il pas abandonné par la première déclaration?

La version Oracle est Enterprise Edition 10.2.0.5.0 - 64bit.

Répondre

1

Oracle a tendance à faire certaines choses de manière étrange, par pure méchanceté, causant des erreurs bizarres, et pour empirer les choses, quand des erreurs surviennent, il tend à donner des messages d'erreur inutiles à carrément trompeurs.

Dans votre cas, la suppression de la contrainte PK_MV ne supprime pas également l'index derrière elle, il vous reste donc un index PK_MV. Ensuite, plus tard, lorsque vous essayez de recréer la contrainte, Oracle insiste sur pour créer également un index, et il ne supportera pas la possibilité qu'un index avec ce nom existe déjà.

Pour ne rien arranger, le message d'erreur ne vous donne aucun indice sur la nature de l'objet existant, il laisse donc l'impression que l'objet existant est une contrainte, puisque c'est ce que vous essayez de créer, alors que l'objet existant est en fait un index, que vous n'avez jamais traité, dont vous n'avez jamais besoin et que vous ne voulez probablement pas savoir.

Ah, adorable Oracle. Mes condoléances pour avoir à l'utiliser.

Alors, essayez ce qui suit:

alter table MV drop constraint PK_MV cascade; 

Le mot-clé cascade provoquera l'indice derrière la contrainte à supprimer également.