En testant certains scripts de migration avec une copie des données de production (les scripts fonctionnent bien avec les données de développement), j'ai trouvé une situation curieuse. UNE CONTRAINTE a changé, donc j'émets des commandes DROP + ADD:
ALTER TABLE A_DUP_CALLE
DROP CONSTRAINT A_DUP_CALLE_UK1;
ALTER TABLE A_DUP_CALLE
ADD CONSTRAINT A_DUP_CALLE_UK1 UNIQUE (
CONTROL_ID,
CALLE_AYTO_DUPL
)
ENABLE;
La commande DROP a bien fonctionné mais celle ADD a échoué. Maintenant, je suis dans un cercle vicieux. Je ne peux pas supprimer la contrainte car elle n'existe pas (la suppression initiale a fonctionné comme prévu):
ORA-02443: Impossible de supprimer la contrainte - contrainte inexistante
Et je ne peux pas le créer car le nom existe déjà:
ORA-00955: le nom est déjà utilisé par un objet existant
Je tape A_DUP_CALLE_UK1
dans la boîte de recherche du développeur SQL et ... le voilà ! Propriétaire, nom de la table, tablescape ... tout matches: il n'est pas un objet différent avec le même nom, il est ma contrainte d' origine. Le tableau apparaît dans les détails de la contrainte mais la contrainte n'apparaît pas dans les détails du tableau.
Mes questions:
- Quelle en est l'explication?
- Comment puis-je m'assurer que cela ne se produira pas lorsque je ferai la mise à niveau réelle sur le serveur en direct?
(Le serveur est 10g XE, je n'ai pas assez de réputation pour créer le tag.)
la source
Réponses:
Je suppose que Marian a raison et cela est dû à un index et à une contrainte uniques portant le même nom, par exemple:
Normalement, lorsque vous ajoutez une contrainte unique, un index unique portant le même nom est créé - mais l'index et la contrainte ne sont pas la même chose. Jetez un œil
all_indexes
pour voir s'il existe un index appeléA_DUP_CALLE_UK1
et essayez de déterminer s'il est utilisé par autre chose avant de le déposer!la source
exp
commande contient uneCREATE UNIQUE INDEX "A_DUP_CALLE_UK1" ...
instruction qui n'est pas présente dans le jeu de scripts d'origine.Semble très étrange.
Tu peux courir:
pour vérifier si de quel type d’objet se plaint Oracle. Ensuite, vous pouvez exécuter l'instruction DROP appropriée pour cela.
La seule autre chose à laquelle je peux penser est de supprimer complètement la table en utilisant
DROP TABLE A_DUP_CALLE CASCADE CONSTRAINTS
pour se débarrasser de tout ce qui appartient à cette table, puis de la recréer complètement.Si le tableau contient des données de valeur, vous pouvez en faire une sauvegarde avant:
Une fois que vous avez recréé la table, vous pouvez faire
pour restaurer les données.
la source
J'ai eu le même problème il y a quelques minutes ... et j'ai trouvé une explication.
En créant une clé primaire, Oracle crée deux objets: une contrainte et un index qui contrôlent la partie "UNIQUE".
En supprimant la contrainte, l'index reste là, en utilisant le même nom de l'index, donc si vous exécutez juste
Vous ne supprimerez que la contrainte. Pour supprimer l'index, vous devrez exécuter
Cela devrait faire le travail. Alternativement, vous pouvez exécuter ces deux commandes en même temps avec la commande
la source
La contrainte de clé primaire est fournie avec l'index. Vous supprimez la contrainte mais pas l'index. Vérifier:
et vous voyez
OBJECT_TYPE
estINDEX
.Faites les deux:
la source
Faites ceci
Ça va marcher.
IMAGE:
la source
ALTER TABLE A_DUP_CALLE DROP CONSTRAINT A_DUP_CALLE_UK1;
Relationship142
et une autreNOT NULL
contrainte a été nomméeSYS_C0015910
. Donc, aSYS_C0015910
été supprimé avec succès avec une simple requête ALTER, maisRelationship142
avait besoin de DOUBLE CITATIONSalter table ... add constraint "Relationship143" ...
"Relationship143"
est en effet un nom différent deRELATIONSHIP143
. Mais"RELATIONSHIP143"
etRELATIONSHIP143
sont identiques"Relationship143"
lui-même. C'était probablement l'un de vos outils qui a fait cela. Quoi qu'il en soit: en l'état, votre réponse est tout simplement fausse dans le contexte de la question d'origine.