Saat menguji beberapa skrip migrasi dengan salinan data produksi (skrip berjalan baik dengan data pengembangan) saya menemukan situasi yang aneh. CONSTRAINT telah berubah jadi saya mengeluarkan perintah 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;
Perintah DROP bekerja dengan baik tetapi ADD satu gagal. Sekarang, saya menjadi lingkaran setan. Saya tidak dapat menghapus batasan karena tidak ada (penurunan awal berfungsi seperti yang diharapkan):
ORA-02443: Tidak dapat menjatuhkan batasan - tidak ada batasan
Dan saya tidak dapat membuatnya karena namanya sudah ada:
ORA-00955: nama sudah digunakan oleh objek yang ada
Saya mengetik A_DUP_CALLE_UK1
di kotak pencarian SQL Developer dan ... ini dia! Pemilik, nama tabel, tablescape ... semuanya cocok: itu bukan objek yang berbeda dengan nama yang sama, itu adalah kendala asli saya. Tabel muncul dalam detail kendala tetapi kendala tidak muncul dalam detail tabel.
Pertanyaan saya:
- Apa penjelasan untuk ini?
- Bagaimana saya bisa memastikan itu tidak akan terjadi ketika saya melakukan peningkatan nyata di server langsung?
(Server 10g XE, saya tidak punya cukup reputasi untuk membuat tag.)
sumber
Jawaban:
Pada tebakan saya akan mengatakan Marian benar dan ini disebabkan oleh indeks unik dan kendala memiliki nama yang sama, misalnya:
Biasanya ketika Anda menambahkan batasan unik, indeks unik dengan nama yang sama dibuat - tetapi indeks dan batasan bukanlah hal yang sama. Lihat
all_indexes
untuk melihat apakah ada indeks yang dipanggilA_DUP_CALLE_UK1
dan coba dan cari tahu apakah itu digunakan oleh sesuatu yang lain sebelum Anda menjatuhkannya!sumber
exp
perintah berisiCREATE UNIQUE INDEX "A_DUP_CALLE_UK1" ...
pernyataan yang tidak ada di set skrip asli.Tampak sangat aneh.
Anda dapat menjalankan:
untuk memeriksa apakah objek apa yang dikeluhkan oleh Oracle. Kemudian Anda dapat menjalankan pernyataan DROP yang sesuai untuk itu.
Satu-satunya hal lain yang dapat saya pikirkan adalah untuk menjatuhkan meja sepenuhnya menggunakan
DROP TABLE A_DUP_CALLE CASCADE CONSTRAINTS
untuk menyingkirkan segala sesuatu yang menjadi milik tabel itu dan kemudian membuat ulang sepenuhnya.Jika tabel berisi data yang berharga, Anda dapat membuat cadangannya sebelumnya:
Setelah Anda membuat ulang tabel, Anda bisa melakukannya
untuk mengembalikan data.
sumber
Saya memiliki masalah yang sama beberapa menit yang lalu ... dan saya telah menemukan penjelasan.
Dengan membuat Kunci Utama, Oracle menciptakan dua objek: batasan, dan indeks, yang mengontrol bagian "UNIK".
Dengan menjatuhkan batasan, indeks tetap di sana, menggunakan nama indeks yang sama, jadi jika Anda mengeksekusi saja
Anda hanya akan menjatuhkan batasannya. Untuk menjatuhkan indeks, Anda harus menjalankan
Ini harus melakukan pekerjaan. Atau, Anda bisa melakukan kedua perintah ini secara bersamaan dengan perintah tersebut
sumber
Kendala kunci primer disertai dengan indeks. Anda menjatuhkan batasan tetapi tidak mengindeks. Memeriksa:
dan Anda lihat
OBJECT_TYPE
adalahINDEX
.Begitu juga keduanya:
sumber
Melakukan hal ini
Itu akan berhasil.
GAMBAR:
sumber
ALTER TABLE A_DUP_CALLE DROP CONSTRAINT A_DUP_CALLE_UK1;
Relationship142
danNOT NULL
kendala lainnya diberi namaSYS_C0015910
. JadiSYS_C0015910
berhasil dihapus dengan permintaan ALTER sederhana, tetapiRelationship142
membutuhkan QUOTES QUUBESalter table ... add constraint "Relationship143" ...
"Relationship143"
memang nama yang berbeda dariRELATIONSHIP143
. Tapi"RELATIONSHIP143"
danRELATIONSHIP143
yang identik"Relationship143"
itu sendiri. Mungkin salah satu alat Anda yang melakukan ini. Pokoknya: sebagaimana adanya, jawaban Anda benar-benar salah dalam konteks pertanyaan awal.