9

シーケンス、ユーザー、その他のオブジェクトを作成/削除するSQLスクリプトがたくさんあります。これらのスクリプトを liquibase を介して実行していますが、存在しないシーケンスを削除しようとしたり、既存のユーザーを作成しようとすると oracle が文句を言うため、失敗します。

エラーの発生を防ぐオラクルの方法はありますか?

ある種の何か

存在しない場合はユーザー/シーケンスを作成

存在する場合はユーザー/セキュリティを削除

私の知る限り、次のオプションがあります。

  • plsqlスクリプトを書く
  • liquibase コンテキストを使用します。
  • liquibase の前提条件を使用しますが、これは作業が多すぎることを意味します。

どんな考え/アイデアも大歓迎です。

4

5 に答える 5

19

Liquibase には、失敗する可能性のある呼び出しを含む changeSet で false に設定できる failOnError 属性があります。

<changeSet failOnError="false">
   <createSequence sequenceName="new_sequence"/>
</changeSet>

これにより、単純なユーザー作成、シーケンス作成、ユーザー削除、シーケンス削除の変更セットを作成できます。ユーザー/シーケンスが存在する/存在しないためにステートメントがエラーをスローした場合でも、実行済みとしてマークされ、更新が続行されます。

このアプローチの欠点は、実行済みとしてマークし、他の理由 (不適切なパーミッション、接続障害、無効な SQL など) でエラーが発生した場合にも続行することです。より正確なアプローチは、次のような前提条件を使用することです。

<changeSet>
   <preconditions onFail="MARK_RAN"><not><sequenceExists/></not></preconditions>
   <createSequence name="new_sequence"/>
</changeSet>

現在、userExists の前提条件はありませんが、カスタムの前提条件を作成するか、前提条件に戻すことができます。ドキュメントについては、 http://www.liquibase.org/documentation/preconditions.htmlを参照してください。

于 2009-10-26T21:48:08.703 に答える
5

これに似た関数 do_ddl を作成し、キャッチしたいすべての例外をキャッチします。

DECLARE
   allready_null EXCEPTION;
   PRAGMA EXCEPTION_INIT(allready_null, -1451);
BEGIN
   execute immediate 'ALTER TABLE TAB MODIFY(COL  NULL)';
EXCEPTION
   WHEN allready_null THEN
      null; -- handle the error
END;
/
于 2009-10-26T15:50:07.890 に答える
2

PL/SQL無名ブロックを使用するだけです。

begin
   for x in (select sequence_name
             from   user_sequences
              where sequence_name in ('SEQ1','SEQ2' ... 'SEQn'))
   loop
      execute immediate 'drop sequence '||x.sequence_name;
   end loop;
end;
/
于 2009-10-26T18:51:31.580 に答える