2

ddl を生成して、Hibernate SchemaExport などを介してすべての db テーブルなどを作成するとします。得られるのは、最初に drop ステートメントで始まるスクリプトです。私はこれが欲しいので、問題ありません。しかし、このスクリプトを実行すると、Oracle データベースで実行されている ORA-00942 エラーが大量に発生します。

テーブルがまだ存在していない場合は実際にはエラーではないため、作成スクリプトを実行したときにエラーが発生しないようにして、何が失敗したか (もしあれば) を簡単に判断できるようにしたいと考えています。

私のオプションは何ですか?テーブルがまだ存在する場合と存在しない場合があるため、ドロップステートメントを生成したいのですが、「できない」という理由だけで(実際のエラーかどうかを判断するために)チェックしなければならない100万のORA-が戻ってくるのは望ましくありません。真新しいテーブルを落としてはいけません。

4

2 に答える 2

3

「ddl を生成して、Hibernate SchemaExport などを介してすべての db テーブルなどを作成するとします。得られるのは、最初に drop ステートメントで始まるスクリプトです。私がこれを望んでいるので、問題ではありません。しかし、このスクリプトを実行すると、ORA のクラップロードが生成されます。 -00942 Oracle データベースで実行中のエラー。"

理想的には、ソース管理と構成管理のベスト プラクティスを使用して、スキーマを適切に維持する必要があります。このシナリオでは、スクリプトを実行するスキーマにそれらのテーブルが含まれているかどうかを事前に知っています。存在しないテーブルを削除しようとしないため、エラーは発生しません。

ただし、これが常に可能であるとは限りません。別の方法の 1 つは、2 つのスクリプトを用意することです。最初のスクリプトには DROP TABLE ステートメントだけがあり、わかりやすい

PROMPT  It is safe to ignore any ORA-00942 errors in the following statements

2 番目のスクリプトには、すべての CREATE TABLE ステートメントが含まれており、次のように続きます。

PROMPT  All the statements in this script should succeed.  So investigate any errors

もう 1 つのオプションは、データ ディクショナリを使用することです。

begin
    for r in ( select table_name from user_tables )
    loop
        execute immediate 'drop table '||r.table_name
                    ||' cascade constraints';
    end loop;
end;

これには注意してください。これは核となるオプションであり、スキーマ内のすべてのテーブルを削除します。

于 2010-10-03T20:32:15.377 に答える
1

ドロップ ステートメントのスクリプトを取得し、Hibernate がそれを実行しない場合は、DROP TABLE ステートメントを IF でラップして、ドロップする前にテーブルが存在するかどうかをテストします。

IF EXISTS(SELECT NULL 
            FROM TABLE_XYZ) THEN
  DROP TABLE TABLE_XYZ;
END IF;
于 2010-10-03T19:39:05.350 に答える