web-dev-qa-db-ja.com

Oracleの別のスキーマからデータを選択する

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モジュールを使用して実行されます。

これを行うことができますか、または新しいデータベース接続を作成する必要がありますか?

9
marianov

データベースへの接続に使用しているユーザー(この例ではAユーザー)は、SELECTスキーマ内のオブジェクトに対するPCTアクセス権を持っていますか? Aにこのアクセス権がないと仮定すると、「テーブルまたはビューが存在しません」というエラーが表示されます。

ほとんどの場合、DB_Aが必要なAスキーマ内のテーブルへのアクセスをユーザーPCTに許可する必要があります。何かのようなもの

GRANT SELECT ON pct.pi_int
   TO a;

これが完了すると、質問で最初に示した構文pct.pi_intを使用して、PCTスキーマ内のオブジェクトを参照できるようになります。ブラケット構文アプローチは機能しません。

23
Justin Cave

許可に加えて、同義語の作成を試みることができます。毎回テーブル所有者スキーマを指定する必要がなくなります。

接続スキーマから:

CREATE SYNONYM pi_int FOR pct.pi_int;

その後、pi_int なので:

SELECT * FROM pi_int;
5

データベースへの接続に使用しているスキーマ/アカウントによっては、データベースへの接続に使用しているアカウントへの許可が不足していると思われます。

データベースのPCTアカウントとして接続し、使用するアカウントにテーブルの選択アクセスを許可します。

grant select on pi_int to Account_used_to_connect
0
Michael Ballent