Question

J'ai créé un package qui contient une procédure stockée que je prévois d'appeler à partir d'une application séparée. La procédure stockée renvoie une liste triée de toutes les vues et les tables du schéma. Pour ce faire, il effectue une sélection simple des synonymes dba_tables et DBA_VIEWS, comme indiqué ci-dessous:

CREATE OR REPLACE
PACKAGE BODY TITAN_ENTITY AS

  PROCEDURE GETSCHEMAOBJECTS (RESULTS IN OUT T_CURSOR)
  IS
    V_CURSOR T_CURSOR;
  BEGIN
    OPEN V_CURSOR FOR
       SELECT 'T' OBJECTTYPE, TABLE_NAME OBJECTNAME 
          FROM DBA_TABLES 
          WHERE OWNER = 'SONAR5'
       UNION ALL
       SELECT 'V' OBJECTTYPE, VIEW_NAME OBJECTNAME 
         FROM DBA_VIEWS 
         WHERE OWNER = 'SONAR5'
       ORDER BY OBJECTNAME;
    RESULTS := V_CURSOR;      

  END GETSCHEMAOBJECTS;

END TITAN_ENTITY;

J'ai vérifié que les synonymes en question existent et sont publiques:

CREATE PUBLIC SYNONYM "DBA_TABLES" FOR "SYS"."DBA_TABLES"
CREATE PUBLIC SYNONYM "DBA_VIEWS" FOR "SYS"."DBA_VIEWS"

Si je comprends bien, parce qu'ils sont publics, je ne ai pas besoin d'autres autorisations pour se rendre à eux. Si cette interprétation est erronée, je voudrais que quelqu'un me détromper de la notion et le point me à des données plus précises.

Maintenant, voici mon problème: je peux ouvrir une feuille de calcul dans Oracle SQL Developer et sélectionnez à partir de ces tables très bien. Je reçois des données significatives (très bien 567 lignes, en effet). Mais lorsque je tente d'exécuter la procédure stockée, Oracle se plaint d'une erreur de compilation, comme indiqué ci-dessous:

Error(9,8): PL/SQL: SQL Statement ignored
Error(10,16): PL/SQL: ORA-00942: table or view does not exist

Lorsque je double-cliquez sur ce deuxième message d'erreur, SQL Developer me prend à la première clause FROM ( "de DBA_TABLES").

Je suis assez perplexe. Je sais très bien SQL Server, et je suis nouveau à Oracle, alors s'il vous plaît garder avec moi. Si vous pouviez fournir quelques indices, ou me diriger dans la bonne direction, je l'apprécie vraiment.

Merci d'avance!

Était-ce utile?

La solution

Utilisez ALL_TABLES et ALL_VIEWS au lieu de DBA_TABLES et DBA_VIEWS. ALL_ vues% devrait être accessible à tous les utilisateurs.

Autres conseils

Si vous sélectionnez d'une table ou une vue dans un PL / SQL-procédure stockée ou un PL stocké / SQL fonction vous avez besoin d'une subvention directe. Une subvention via un rôle de base de données ne suffit pas.

Vous avez probablement besoin d'une subvention directe sur dba_tables vue. Synonymes (public) sont des synonymes (public). Vous devez directement accorder des droits de sélection.

Voir ici: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:48704116042682#48798240264807

Modifier Désolé, je passé sous silence la partie où vous semblez dire que vous pouvez choisir parmi DBA_TABLES directement. Très probablement le problème est que vos privilèges sont accordés par un rôle de quelqu'un d'autre réponse. Mais il est toujours utile d'expliquer que votre compréhension des synonymes PUBLIC est incomplète, et que l'utilisation ALL_TABLES serait mieux si elle accomplit ce dont vous avez besoin.

Le synonyme étant PUBLIC signifie seulement que tous les utilisateurs peuvent référencer le synonyme; il ne leur accorde pas l'accès à l'objet que le synonyme fait référence.

Qu'est-ce que vous feriez pour résoudre le plus directement cette erreur subvention privilège SELECT sur les vues SYS à l'utilisateur (s) qui se déroulera cette procédure. Cependant, je pense que c'est un très mauvaise idée.

Comme suggéré par Raimonds, vérifiez si vous pouvez obtenir ce que vous avez besoin de USER_TABLES ou ALL_TABLES au lieu. Qu'est-ce que l'utilisateur appelle cette procédure, et que l'accès est-ce que l'utilisateur dispose aux tables de SONAR5?

En général, si votre demande est intéressé par une table, on peut supposer qu'il a des privilèges à ce sujet, auquel cas est devrait figurer à l'ALL_TABLES.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top