4


INSERT ステートメントを使用して、データベース テーブルにデータを挿入しようとしています。ストアド プロシージャを使用しています。
しかし、そうしている間にこのエラーが発生します。

メッセージ: ORA-00942: テーブルまたはビューが存在しません ORA-06512


テーブル/ストアドプロシージャが存在するかどうかを確認し、すべてが整っています。また、テーブル名やspにタイプミスはありません。クエリ エディターから SP の一部を実行すると正常に動作しますが、SP 全体を実行するとエラーがスローされます。


Stephen が提供する手順を試してみましたが、Grant コマンドを実行したときに同じユーザー/所有者でログインしたため、「独自に許可/取り消すことはできません」というエラーが表示されます。
これにもう一つ追加。selectステートメントを使用しているストアドプロシージャSP1があります

Select a from table_name where condition;

これを個別に実行すると、いくつかの結果が返されます。しかし、spを実行すると、それが書かれているのと同じ行でエラーが発生します。


誰でもこの問題を解決するのを手伝ってくれますか? 私はSQL +を使用しています。
よろしくお願いします

4

5 に答える 5

11

ジャスティンの答えは正しいですが、少し拡張させてください。

テーブルが存在しないと言った人は皆、あなたの投稿全体を読んでいません。あなたができるので:

クエリエディターから SP の一部を実行すると、正常に動作します

もちろん、テーブルはそこにあります。明らかに、あなたはそれにアクセスできます。そうしないと、明らかに機能するときに機能しません。

しかし、SP全体を実行するとエラーがスローされます。

これは、Oracle が直接付与されたパーミッションとロールを介して付与されたパーミッションを区別するためです。

私がこれをするとします:

Create Table TABLE_A
Create Role READ_ONLY
Grant Select on TABLE_A to READ_ONLY
Grant READ_ONLY to VIJAY

SQL ウィンドウ/プロンプトでは、問題なくそのテーブルをクエリできます。ビューを作成する必要があります

Create VIJAY.VIEW_A as SELECT * FROM TABLE_A

TABLE_A が存在するというエラーが表示されます。ビューはコンパイルされるため、プロシージャのようにロールなしで実行されます。READ_ONLY ロールなしで実行されるため、TABLE_A が存在するという事実はわかりません。今、私がしなければならないことは

Grant Select on TABLE_A to VIJAY.

直接のアクセス許可を取得したので、そのテーブルを使用するビューまたはプロシージャ/パッケージをコンパイルできます。

于 2011-02-08T15:41:38.017 に答える
8

ストアドプロシージャが存在するスキーマにテーブルが存在しますか?そうでない場合、最も簡単な説明は、プロシージャの所有者が直接付与ではなくロールを介してテーブルへのアクセスを許可されていることです。定義者の権限ストアドプロシージャは、アクセスするオブジェクトに直接アクセスできる必要があります。これをテストする簡単な方法は、セッションのロールを無効にすることです。

SQL> set role none;
SQL> <<execute your query>>

それがエラーを生成する場合、問題は直接助成金の欠如です。

于 2011-02-08T04:46:44.543 に答える
3

Oracle では、ストアド プロシージャを実行者または定義者のどちらの権限で実行するかを選択できます。

ストアード・プロシージャーの AUTHID プロパティーが正しいかどうか、および結果のユーザーが適切な権限を持っているかどうかを確認してください。

于 2011-02-07T19:36:24.797 に答える
1

Joe Stefanelliが言ったように、ここに表示されているエラーには多くの可能性があります。

かどうか確かめる:

  1. 正しいOracleインスタンスに接続しています。
  2. クエリで参照しているテーブルに対してクエリを実行したり、処理を実行したりする権限があります。
  3. 通常のselectステートメントとプロシージャには違いがあります。Oracleのプロシージャは、ユーザーに割り当てられたロールを尊重しません。むしろ、権限はユーザーに明示的に付与される必要があります。詳細については、次のリンクを参照してください。ORA-00942
于 2011-02-07T16:12:26.893 に答える
1

簡単に言えば、データを挿入しようとしているテーブルは、接続しているデータベースには存在しません。これらの両方を確認する必要があります (つまり、何に接続しているか、そこにテーブルがあり、使用しているユーザー コンテキストにアクセスできるか)。

于 2011-02-07T16:04:42.783 に答える