Menambahkan kolom ke tabel Oracle OLTP

Saya mencoba menambahkan kolom nullable ke tabel yang sering digunakan di database Oracle 10 OLTP saat aplikasi sedang berjalan dan sibuk. Menambahkan kolom nullable hanyalah perubahan kamus data dan oleh karena itu kunci tabel apa pun hanya ditahan untuk jangka waktu singkat (yang dapat ditangani oleh sistem).

Masalahnya ALTER TABLE saya sering gagal dengan ini:

ORA-00054: resource busy and acquire with NOWAIT specified

Pendekatan saya saat ini adalah melakukan perubahan dengan menjalankannya sampai tidak ada kunci di atas meja. Ini berarti saya tidak dapat menjalankan skrip seperti itu di SQL*Plus secara penuh, tetapi perlu menyalin dan menempelkan setiap pernyataan dan memastikannya berfungsi.

Apakah ada cara yang lebih baik?


person WW.    schedule 10.02.2011    source sumber
comment
Ingatlah bahwa ini akan mendekompilasi apa pun (tampilan, paket, pemicu, dll) yang bergantung pada tabel, yang mungkin tidak begitu baik di lingkungan produksi....   -  person cagcowboy    schedule 10.02.2011
comment
+1 untuk komentar cagcowboy. Tidak baik bagi kode untuk mengubah tabel di lingkungan prod, banyak objek yang berpotensi tidak valid. Ini adalah masalah pengendalian perubahan yang perlu dikoordinasikan   -  person tbone    schedule 10.02.2011
comment
11g telah sedikit memperbaiki situasi kompilasi ulang, dengan tingkat pelacakan dependensi yang lebih rendah.   -  person Gary Myers    schedule 11.02.2011
comment
Beberapa objek menjadi tidak valid dan dikompilasi ulang secara otomatis saat digunakan berikutnya. Lebih baik daripada mematikan aplikasi untuk jeda sebentar. Jumlah PL/SQL yang ada tidak banyak sehingga tidak membutuhkan waktu lama. Aplikasi menangani ORA-04068: status paket yang ada telah dibuang   -  person WW.    schedule 11.02.2011


Jawaban (1)


Bagaimana dengan pendekatan brute force? Masukkan ke dalam loop tak terbatas dan keluar setelah selesai. Pseudocode (belum memeriksanya):

create or replace 
procedure execDDL(ddl in varchar2) is
   myexp EXCEPTION;
   pragma exception_init (myexp, -54);
begin

 loop
   begin
      execute immediate ddl;
      exit;
   exception
      when myexp then 
         null;
 end loop;
 end;
person Samuel    schedule 10.02.2011
comment
+1, meskipun saya akan menambahkan panggilan ke dbms_lock.sleep sehingga blok Anda tidak memonopoli sumber daya secara sia-sia (tunggu sebentar di antara dua percobaan). - person Vincent Malgrat; 10.02.2011
comment
Saya kira saya bisa melakukan ini, tapi sepertinya tidak terlalu elegan - person WW.; 11.02.2011