it-swarm.asia

ORA-01502: indeks atau partisi dari indeks tersebut berada dalam masalah status yang dapat digunakan

Saya punya tabel di database Oracle saya, di mana

select pkcol, count(*) from myTable group by pkcol having count(*) > 1;

hasil panen

  PKCOL   COUNT(*)
------- ----------
      1          2
      2          2

Mencoba menghapus baris duplikat

delete myTable where pkcol = 1;

Hasil:

ORA-01502: indeks 'MYTABLE.PK_MT' atau partisi dari indeks tersebut dalam kondisi dapat digunakan.

Saya menggunakan Oracle.DataAccess.Client.OracleBulkCopy untuk mengisi tabel.

Sejauh yang saya mengerti dokumentasi dari Oracle PRIMARY KEY kendala harus diperiksa.

Jelas mereka tidak diperiksa, seperti yang saya temukan dengan melakukan bulkcopy yang sama dua kali berturut-turut yang berakhir dengan duplikat di semua baris.

Sekarang saya hanya menggunakannya setelah menghapus semua baris dan saya menggunakan tabel dengan kunci utama yang sama sebagai sumber. Akibatnya saya tidak mengharapkan masalah.

Tapi tertanam jauh di dalam skrip MS Build saya, saya berakhir dengan hanya 2 duplikat dari 2210 baris.

Saya kira mengabaikan kunci utama di tempat pertama adalah bug yang jelas. Tidak ada Bulkcopy yang diizinkan untuk mengabaikan batasan kunci primer.

Edit:

Sementara itu saya menemukan, bahwa 2 baris yang saling bertentangan di mana biasanya dimasukkan oleh beberapa skrip sebelum bulkcopy dipanggil. Masalahnya berkurang menjadi masalah saya yang diketahui, bahwa bulkcopy tidak memeriksa kunci utama di sini.

6
bernd_k

Dari dokumentasi yang Anda tautkan :

Batasan UNIK diverifikasi ketika indeks dibangun kembali pada akhir beban. Indeks dibiarkan dalam status Indeks Tidak Dapat Digunakan jika melanggar batasan UNIK.

Mereka cara saya membacanya, hal yang sama berlaku untuk PRIMARY KEY kendala meskipun kata-katanya sedikit ambigu. Anda mungkin tidak menyukai perilaku ini, tetapi ini bukan "bug" karena berperilaku seperti yang dirancang - dan ada cara lain untuk mengakhiri dengan batasan 'rusak' semacam ini.

Lihat pos OTN ini untuk informasi lebih lanjut dan pendekatan yang mungkin bekerja lebih baik untuk Anda menggunakan pl/sql dan forall ... save exceptions.

Menghadapi masalah serupa.

Jika Anda hanya perlu menyingkirkan kesalahan, lakukan:

SELECT 'ALTER INDEX '||OWNER||'.'||INDEX_NAME||' REBUILD;'
FROM DBA_INDEXES
WHERE STATUS = 'UNUSABLE';

Ini akan menampilkan ALTER INDEX ... REBUILD; pernyataan untuk semua indeks "tidak dapat digunakan". Jalankan mereka, sehingga indeks dapat "digunakan" lagi.

(Tanpa malu-malu disalin dari: http://www.squaredba.com/ora-01502-index-or-partition-of-such-index-is-in-unusable-state-145.html : -))

8
Frosty Z