質問

DDLを生成して、Hibernate Schemaexportなどを介してすべてのDBテーブルなどを作成してください。私はこれが欲しいので、問題ではありません。しかし、このスクリプトを実行すると、Oracle DBで実行されているORA-00942エラーのがらくたが生成されます。

テーブルがまだ存在していなかった場合、それらは実際にエラーではないので、実行するときに私の作成スクリプトがエラーのない状態になりたいので、何が失敗したかを簡単に判断できます。

私の選択肢は何ですか?テーブルがまだ存在するかもしれないし、まだ存在しないかもしれないので、ドロップステートメントを生成したいのですが、私に戻ってくることは望ましくありません(実際のエラーかどうかを判断するために)確認する必要があります。 t真新しいテーブルをドロップします。

役に立ちましたか?

解決

ドロップステートメントのスクリプトを取得すると、hibernateがそれを行わない場合、ドロップテーブルステートメントをドロップする前にテーブルが存在するかどうかをテストする場合は、

IF EXISTS(SELECT NULL 
            FROM TABLE_XYZ) THEN
  DROP TABLE TABLE_XYZ;
END IF;

他のヒント

「DDLを生成してすべてのDBテーブルなどをHibernate Schemaexportなどを介して作成するとしましょう。入手するのは、最初にドロップステートメントから始まるスクリプトです。問題ではなく、このスクリプトを実行するとOraのがらくたが生成されます。 -00942 Oracle DBで実行されるエラー。」

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

ただし、これを行うことは常に可能ではありません。別のアプローチの1つは、2つのスクリプトを作成することです。最初のスクリプトには、フレンドリーでプレハーブされたドロップテーブルステートメントがあります

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

2番目のスクリプトにはすべての作成テーブルステートメントがあり、

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

別のオプションは、データ辞書を使用することです。

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

これには注意してください。これは核の選択肢であり、スキーマのすべてのテーブルをドロップします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top