2011-02-10 16 views
3

アプリケーションが実行中でビジー状態の間に、Oracle 10 OLTPデータベース内のよく使用されるテーブルにnull許容列を追加しようとしています。 NULL可能列の追加はデータ・ディクショナリーの変更のみであり、したがって、すべての表ロックは短期間(システムによって処理可能)保持されます。Oracle OLTPテーブルへのカラムの追加

問題は、私のALTER TABLEは、多くの場合、これに失敗したということです。

ORA-00054: resource busy and acquire with NOWAIT specified 

私の現在のアプローチは、テーブルの上にはロックがないように発生するまで、それを実行して、変更をbludgenすることです。つまり、SQL * Plusでこのようなスクリプトを完全に実行することはできませんが、各文をコピーして貼り付け、動作させる必要があります。

良い方法がありますか?

+1

表に依存しているもの(ビュー、パッケージ、トリガーなど)は、本番環境ではあまりうまくいきません。 .. – cagcowboy

+0

+1のcagcowboyさんのコメント。 prod環境でテーブルを変更するコードではうまくいかず、多くの無効化されたオブジェクトが潜在的に存在します。 – tbone

+0

11gを調整する必要がある変更管理の問題は、依存性の低いレベルの追跡で少し再コンパイルの状況を改善しました。 –

答えて

2

ブルートフォースアプローチはどうですか?それを無限ループに入れ、終了すると終了します。擬似コード(チェックしていない):

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; 
+1

+1ですが、[dbms_lock.sleep](http://download.oracle.com/docs/cd/B19306_01/appdev.102)の呼び出しを追加します。 /b14258/d_lock.htm#i997212)、ブロックが不必要にリソースを独占しないようにします(2回の試行の間に短い待ち時間)。 –

+0

私はこれを行うことができると思うが、それは非常にエレガントに見えない –

関連する問題