1

これは、DBA を含む 5 人が何日も苦労してきた厄介なケースです。

ここにあります:

Oracle クライアント: 10g Oracle サーバー: 11g

2 つのスキーマと 1 人のユーザーがあります。

SCHEMA1

SCHEMA2

USER

( )'TOTO'で定義された1 つのテーブルがあります。次のように作成された、 defined inと呼ばれるtable のプライベート シノニムがあります。SCHEMA1SCHEMA1.TOTO'TOTO''TOTO'SCHEMA2

CREATE SYNONYM SCHEMA2.TOTO FOR SCHEMA1.TABLE1;

「SCHEMA2.TOTO」(シノニムについても同様)に対する SELECT,UPDATE,DELETE,INSERT 権限を SCHEMA2 に付与しました(SCHEMA2 から実行されたすべてのセッションがシノニム テーブルにアクセスできるようにするため)。

GRANT SELECT, UPDATE, DELETE, INSERT ON SCHEMA2.TOTO TO SCHEMA2;

私たちのアプリケーションは で DB に接続しUSER、次に に直接切り替えますSCHEMA2

ALTER SESSION SET CURRENT_SCHEMA=SCHEMA2;

その後、シノニム名の前に SCHEMA1 を付けずに、シノニム テーブルに対して選択クエリを実行しようとします (これは、使用するフレームワークの制約です)。

SELECT COL FROM TOTO;

SCHEMA2ほとんどの場合、このクエリは正常に機能します。これは、デフォルトでオブジェクトが参照される場所にセッションを変更したためです。

ただし、ORA-00942: table or view does not existエラーで失敗することもあります。

私は、それが機能してから失敗するまでの間、何も変わっておらず、アプリケーションを再起動しただけであるという事実を主張します (もちろん、起動するたびに同じ方法で DB に再接続します)。DBA が USER,SCHEMA1,SCHEMA2 のすべてのイベントを監視し、成功と失敗の間でそれらの 1 つの GRANTS を変更する外部プロセスを見つけることを期待して調査しましたが、何も変わりません。それでも、ある時点でランダムにORA-00942エラーが発生し、アプリケーションを数回再起動すると再び戻ってきます...

ここで欠けているものを特定するのに役立つアイデアや提案/ヒントを誰かが持っていますか?

助けてくれて本当にありがとうございます!

4

1 に答える 1

3

USER助成金は、SCHEMA2ではなくに行く必要があります。

GRANT SELECT, UPDATE, DELETE, INSERT ON schema1.toto TO userxy;

これで問題は解決するはずです。そうでない場合は、の結果を投稿していただけますか

SELECT * FROM all_objects WHERE object_name='TOTO';
于 2012-11-29T18:05:39.030 に答える