Ao testar alguns scripts de migração com uma cópia dos dados de produção (os scripts funcionam bem com os dados de desenvolvimento), encontrei uma situação curiosa. Um CONSTRAINT mudou, por isso estou emitindo comandos 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;
O comando DROP funcionou bem, mas o comando ADD falhou. Agora, estou em um círculo vicioso. Não consigo descartar a restrição porque ela não existe (a queda inicial funcionou conforme o esperado):
ORA-02443: Não é possível eliminar a restrição - restrição inexistente
E não posso criá-lo porque o nome já existe:
ORA-00955: nome já é usado por um objeto existente
Digito A_DUP_CALLE_UK1
na caixa de pesquisa do desenvolvedor SQL e ... aí está! Proprietário, nome da tabela, paisagem da tabela ... tudo corresponde: não é um objeto diferente com o mesmo nome, é a minha restrição original. A tabela aparece nos detalhes da restrição, mas a restrição não aparece nos detalhes da tabela.
Minhas perguntas:
- Qual a explicação para isso?
- Como garantir que isso não aconteça quando eu fizer a atualização real no servidor ativo?
(O servidor é 10g XE, não tenho reputação suficiente para criar a tag.)
fonte
Respostas:
Suponho que eu diria que Marian está certa e isso é causado por um índice e restrição únicos com o mesmo nome, por exemplo:
Normalmente, quando você adiciona uma restrição exclusiva, um índice exclusivo com o mesmo nome é criado - mas o índice e a restrição não são a mesma coisa. Dê uma olhada
all_indexes
para ver se há um índice chamadoA_DUP_CALLE_UK1
e tente descobrir se ele é usado por outra coisa antes de soltá-lo!fonte
exp
comando contém umaCREATE UNIQUE INDEX "A_DUP_CALLE_UK1" ...
instrução que não está presente no conjunto de scripts original.Parece muito estranho.
Você pode correr:
para verificar se de que tipo de objeto a Oracle se queixa. Em seguida, você pode executar a instrução DROP apropriada para isso.
A única outra coisa em que consigo pensar é soltar a tabela completamente usando-a
DROP TABLE A_DUP_CALLE CASCADE CONSTRAINTS
para se livrar de tudo o que pertence a ela e depois recriá-la completamente.Se a tabela contiver dados valiosos, você poderá fazer um backup deles antes:
Depois de recriar a tabela, você pode fazer
para restaurar os dados.
fonte
Eu tive o mesmo problema há alguns minutos atrás ... e encontrei uma explicação.
Ao criar uma Chave Primária, o Oracle cria dois objetos: uma restrição e um índice, que controla a parte "ÚNICA".
Ao eliminar a restrição, o índice permanece lá, usando o mesmo nome do índice, portanto, se você executar apenas
Você eliminará apenas a restrição. Para soltar o índice, você precisará executar
Isso deve fazer o trabalho. Como alternativa, você pode executar esses dois comandos ao mesmo tempo com o comando
fonte
A restrição de chave primária vem com o índice. Você elimina a restrição, mas não o índice. Verifica:
e você vê
OBJECT_TYPE
éINDEX
.O mesmo acontece com os dois:
fonte
Faça isso
Vai funcionar.
IMAGEM:
fonte
ALTER TABLE A_DUP_CALLE DROP CONSTRAINT A_DUP_CALLE_UK1;
Relationship142
e outro nome deNOT NULL
restrição foi dadoSYS_C0015910
. EntãoSYS_C0015910
foi excluído com sucesso com uma simples consulta ALTER, masRelationship142
precisava de aspasalter table ... add constraint "Relationship143" ...
"Relationship143"
é realmente um nome diferente deRELATIONSHIP143
. Mas"RELATIONSHIP143"
eRELATIONSHIP143
são idênticos"Relationship143"
ele mesmo. Provavelmente foi uma das suas ferramentas que fez isso. Enfim: como está, sua resposta está simplesmente errada no contexto da pergunta original.