これは、DBA を含む 5 人が何日も苦労してきた厄介なケースです。
ここにあります:
Oracle クライアント: 10g Oracle サーバー: 11g
2 つのスキーマと 1 人のユーザーがあります。
SCHEMA1
SCHEMA2
USER
( )'TOTO'
で定義された1 つのテーブルがあります。次のように作成された、 defined inと呼ばれるtable のプライベート シノニムがあります。SCHEMA1
SCHEMA1.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エラーが発生し、アプリケーションを数回再起動すると再び戻ってきます...
ここで欠けているものを特定するのに役立つアイデアや提案/ヒントを誰かが持っていますか?
助けてくれて本当にありがとうございます!