DDLのORA-00942エラーを抑制しますスクリプトを作成します
-
27-09-2019 - |
質問
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;
これには注意してください。これは核の選択肢であり、スキーマのすべてのテーブルをドロップします。