DB接続で指定されたものとは異なるスキーマ(同じOracleサーバー、同じデータベース、異なるスキーマ)からデータを選択するクエリを実行したい
python Oracleサーバーと通信するアプリがあります。データベース(サーバー/スキーマ)Aへの接続を開き、そのデータベース内のテーブルへの選択クエリを実行します。
私は次を試しました:
select ....
from pct.pi_int, pct.pi_ma, pct.pi_es
where ...
しかし、私は得る:
ORA-00942: table or view does not exist
スキーマ名を角かっこで囲みました:
from [PCT].pi_int, [PCT].pi_ma, [PCAT].pi_es
私は得る:
ORA-00903: invalid table name
クエリは、pythonアプリ内からcx_Oracle Djangoモジュールを使用して実行されます。
これを行うことができますか、または新しいデータベース接続を作成する必要がありますか?
データベースへの接続に使用しているユーザー(この例ではA
ユーザー)は、SELECT
スキーマ内のオブジェクトに対するPCT
アクセス権を持っていますか? A
にこのアクセス権がないと仮定すると、「テーブルまたはビューが存在しません」というエラーが表示されます。
ほとんどの場合、DB_Aが必要なA
スキーマ内のテーブルへのアクセスをユーザーPCT
に許可する必要があります。何かのようなもの
GRANT SELECT ON pct.pi_int
TO a;
これが完了すると、質問で最初に示した構文pct.pi_int
を使用して、PCT
スキーマ内のオブジェクトを参照できるようになります。ブラケット構文アプローチは機能しません。
許可に加えて、同義語の作成を試みることができます。毎回テーブル所有者スキーマを指定する必要がなくなります。
接続スキーマから:
CREATE SYNONYM pi_int FOR pct.pi_int;
その後、pi_int
なので:
SELECT * FROM pi_int;
データベースへの接続に使用しているスキーマ/アカウントによっては、データベースへの接続に使用しているアカウントへの許可が不足していると思われます。
データベースのPCTアカウントとして接続し、使用するアカウントにテーブルの選択アクセスを許可します。
grant select on pi_int to Account_used_to_connect