63

Oracleを使用したことがある場合は、「ORA-00942:テーブルまたはビューが存在しません」という役立つメッセージが表示される可能性があります。メッセージに欠落しているオブジェクトの名前が含まれていない正当な技術的理由はありますか?

これについての議論は、TSAによって作成されたように聞こえるセキュリティによるものです。私が攻撃者であれば、どのテーブルを悪用しようとしたかがわかり、この役に立たないメッセージを簡単に解釈できます。私がアプリケーションコードのいくつかのレイヤーを介して複雑な結合を処理している開発者である場合、それを判断するのは非常に難しいことがよくあります。

私の推測では、このエラーが最初に実装されたとき、誰かがオブジェクト名を追加することを怠りました、そして今、人々はそれを修正するために互換性を壊すのではないかと心配しています。(エラーメッセージの解析などのばかげたことを行うコードは、変更されると混乱します。)

欠落しているテーブルの名前を判別するための(DBAを採用するのではなく)開発者にとって使いやすい方法はありますか?


トピックに関連する回答を受け入れましたが、実際には私の質問に答えていません。エラーメッセージの名前の部分がないのはなぜですか。誰かが本当の答えを思い付くことができれば、私は私の投票を変更させていただきます。

4

8 に答える 8

14

パラメータ ファイル (プレーン テキストまたは spfile) に EVENT を設定して、Oracle に詳細なトレース ファイルを user_dump_dest に強制的にダンプさせることができます。

EVENT="942 トレース名 errorstack レベル 12"

プレーン テキスト ファイルを使用している場合は、すべての EVENT 設定を連続した行に保持する必要があります。それがspfileにどのように適用されたのかわかりません。

于 2008-09-05T17:51:57.167 に答える
12

SQL*Plus は、存在しないテーブルを示します。例えば:

SQL> select
  2     *
  3  from
  4     user_tables a,
  5     non_existent_table b
  6  where
  7     a.table_name = b.table_name;
   non_existent_table b
   *
ERROR at line 5:
ORA-00942: table or view does not exist

ここでは、欠落しているテーブルの名前と、エラーが発生した SQL ステートメントの行番号が示されています。

同様に、1 行の SQL ステートメントでは、不明なテーブルの名前がアスタリスクで強調表示されていることがわかります。

SQL> select * from user_tables a, non_existent_table b where a.table_name = b.table_name;
select * from user_tables a, non_existent_table b where a.table_name = b.table_name
                             *
ERROR at line 1:
ORA-00942: table or view does not exist

あなたの質問に関しては、エラーメッセージにテーブルの名前が含まれていない理由は、エラーメッセージ自体が静的テキストである必要があるためだと思います。エラー行の行番号と位置は、(何らかの方法で) SQL*Plus に明確に返されます。

于 2008-09-09T15:11:58.407 に答える
6

SQL+ を使用すると、どのテーブル名が受け入れられないかを理解できるという意見には同意しません。確かに、直接 DML に役立ちますが、解析は非常に困難です。しかし、動的になると、何の助けにもなりません。

SQL> begin
  2  execute immediate 'insert into blabla values(1)';
  3  end;
  4  /
begin
*
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-06512: at line 2
于 2011-01-31T12:32:54.493 に答える
5

TOAD や TORA などの SQL ブラウジング ツールを使用している場合は、エラーが発生した場所を強調表示するか、カーソルを移動することで ORA エラーを解決できます。

SQL をコピーして、これらのツールのいずれかに貼り付けてください。また、利用可能な分析情報も役立つ場合があります。

于 2008-09-05T17:55:49.810 に答える
3

理由1:多言語インターフェース

データベースインスタンス用の言語固有のメッセージ構成ファイルがあります。メッセージはそこから取り出され、純粋な数値バージョンから数値+テキストバージョンに変換されます。

不適切にフォーマットされた「%s」文字列が原因で不思議な障害が発生するリスクを実行時に実行するよりも、ハードコードされた文字列を使用する方がおそらく適切であると考えられました。

(ところで、私はこのPOVに特に同意するわけではありません。)

理由2:セキュリティ

今のところ、PHPなどを印刷してOracleエラーメッセージをブラウザにダンプする場合、アプリケーションの内部動作を特に公開​​することはありません。

デフォルトでより詳細な情報が印刷された場合、アプリケーションはもう少し公開されます...たとえば、シティバンクがより説明的なメッセージを印刷した場合。

(上記の免責事項を参照してください。エラーについても詳細をお知らせします。)

于 2009-04-21T03:54:47.493 に答える
3

それほど大きなステートメントではない場合、最も簡単な方法は、データ ディクショナリを確認することです。

SQL> select * from xx,abc;
select * from xx,abc
                 *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> select owner,table_name from all_tables where table_name in ('XX','ABC');

OWNER                          TABLE_NAME
------------------------------ ------------------------------
MWATSON                        XX

SQL> 

これは理想的ではありませんが、トレース ファイルにアクセスして調べる以外に、どうすればよいかわかりません。

于 2008-09-06T00:58:34.520 に答える
3

Oracle のエラー メッセージの解釈で問題が発生したことはありません。その理由の 1 つは、SQL for Oracle を開発するために私が見た対話型ツールはどれも、クエリが間違っていた場所を指摘してくれるからです。これには、他の人が指摘したように、SQL*Plus と Perl DBI モジュールが含まれます。

$ exec_sql.pl 'select * from daul'
DBD::Oracle::db prepare failed: ORA-00942: table or view does not exist (DBD ERROR: error possibly near <*> indicator at char 14 in 'select * from <*>daul') [for Statement "select * from daul"] at exec_sql.pl line 68.

うーん、一行にまとめてあるのでちょっと読みづらいですしかし、GUI ツールは、Oracle がクエリで問題を起こし始めたトークンを指すことができます。パーサーで少し作業を行うと、問題のあるテーブルを選択するツールを作成できます。

根本的な質問に答えるために、Oracle エラーは期待どおりに動作するように設計されていないようです。私が知る限り、Oracle のエラー メッセージはいずれも変数テキストをサポートしていません。代わりに、Oracle は、エラー番号とエラーが発生した場所の 2 ビットの情報を返します。適切なツールがあれば、これらのデータでエラーを診断するのは非常に簡単です。オラクルのシステムは、エラーに応じてさまざまな量の診断データを提供するシステムよりも、ツールの作成者に適していると言えます。問題のある場所を強調するために、Oracle のすべてのエラー メッセージ (将来のエラーを含む) 用のカスタム パーサーを作成する必要があると想像してください。

テーブル名を含めると誤解を招く場合があります。どこで問題が発生したかを知るだけでも、非常に役立ちます。

SQL> select * from where dummy = 'X';
select * from where dummy = 'X'
              *
ERROR at line 1:
ORA-00903: invalid table name

オラクルがこのような方法を選択した理由については、次のような推測があります。

  1. IBM はこのスタイルのエラー メッセージを System R に使用し、Larry Ellison、Bob Miner、Ed Oates はこれをコピーして Oracle V2 を構築しました。(下位互換性。)

  2. エラー番号と場所は、診断情報を可能な限り小さく表現したものです。(倹約。)

  3. 上で示したように、Oracle に接続するツールの作成を簡素化するためです。(相互運用性。)

いずれにせよ、どのテーブルが存在しないかを把握するのに DBA である必要はないと思います。適切なツールを使用するだけです。(そして、あなたの期待を調整してください。)

于 2009-04-21T00:03:19.810 に答える
1

@マシュー

クエリは開始ですが、複数のスキーマがある場合は機能しない可能性があります。たとえば、自分自身としてインスタンスにログインすると、すべてのテーブルへの読み取りアクセス権があります。しかし、テーブル名をスキーマで修飾しないと、シノニムのないテーブルに対して ORA-00942 が返されます。

SQL> ツールから * を選択します。
select * ツールから
              *
1 行目のエラー:
ORA-00942: 表またはビューが存在しません

ただし、テーブルは引き続き all_tables に表示されます。

SQL> select owner, table_name from all_tables where table_name = 'TOOLS';

OWNER TABLE_NAME
------------------------------ -------------------------------- ----------
アプリケーションツール

@erikson申し訳ありませんが、あまり役に立ちません。私はマークと一緒です - 私はTOADを使いました。

于 2008-09-07T13:07:45.710 に答える