web-dev-qa-db-fra.com

SÉLECTIONNER des données d'un autre schéma dans Oracle

Je souhaite exécuter une requête qui sélectionne les données d'un schéma différent de celui spécifié dans la connexion DB (même serveur Oracle, même base de données, schéma différent)

J'ai une application python parlant à un serveur Oracle. Elle ouvre une connexion à la base de données (serveur/schéma) A et exécute certaines requêtes sur les tables de cette base de données.

J'ai essayé ce qui suit:

select .... 
from pct.pi_int, pct.pi_ma, pct.pi_es
where ...

Mais je reçois:

ORA-00942: table or view does not exist

J'ai également essayé d'entourer le nom du schéma avec des crochets:

from [PCT].pi_int, [PCT].pi_ma, [PCAT].pi_es

Je reçois:

ORA-00903: invalid table name

Les requêtes sont exécutées à l'aide du module cx_Oracle python depuis l'intérieur d'une application Django.

Cela peut-il être fait ou dois-je établir une nouvelle connexion db?

9
marianov

L'utilisateur que vous utilisez pour vous connecter à la base de données (utilisateur A dans cet exemple) dispose-t-il d'un accès SELECT sur les objets du schéma PCT? En supposant que A ne dispose pas de cet accès, vous obtiendrez l'erreur "la table ou la vue n'existe pas".

Très probablement, vous avez besoin de votre DBA pour accorder à l'utilisateur A l'accès aux tables du schéma PCT dont vous avez besoin. Quelque chose comme

GRANT SELECT ON pct.pi_int
   TO a;

Une fois cela fait, vous devriez pouvoir vous référer aux objets dans le schéma PCT en utilisant la syntaxe pct.pi_int comme vous l'avez démontré initialement dans votre question. L'approche de la syntaxe des crochets ne fonctionnera pas.

23
Justin Cave

En plus des subventions, vous pouvez essayer de créer des synonymes. Cela évite d'avoir à spécifier à chaque fois le schéma du propriétaire de la table.

A partir du schéma de connexion:

CREATE SYNONYM pi_int FOR pct.pi_int;

Ensuite, vous pouvez interroger pi_int comme:

SELECT * FROM pi_int;
5
Sanjaya Balasuriya

Selon le schéma/compte que vous utilisez pour vous connecter à la base de données, je soupçonne qu'il vous manque une autorisation pour le compte que vous utilisez pour vous connecter à la base de données.

Connectez-vous en tant que compte PCT dans la base de données, puis accordez au compte que vous utilisez l'accès sélectif à la table.

grant select on pi_int to Account_used_to_connect
0
Michael Ballent