Frage

Ich habe ein Paket erstellt, die eine gespeicherte Prozedur enthält, die ich plane, von einer separaten Anwendung aufzurufen. Die gespeicherte Prozedur wird eine sortierte Liste aller Ansichten und Tabellen im Schema zurückzukehren. Um das zu tun, führt es eine einfache Auswahl auf dem DBA_TABLES und DBA_VIEWS Synonyme, wie unten dargestellt:

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;

Ich habe festgestellt, dass die Synonyme in Frage existieren, und sind öffentlich:

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

Mein Verständnis ist, dass, weil sie öffentlich sind, ich brauche keine weiteren Berechtigungen nicht zu ihnen zu bekommen. Wenn das Verständnis falsch ist, möchte ich mich jemand von der Idee abzubringen würde und zeigen Sie mir genauere Daten.

Jetzt ist hier mein Problem: Ich habe ein Arbeitsblatt in Oracle SQL Developer öffnen und wählen Sie aus diesen Tabellen gut. Ich aussagekräftige Daten nur fein (567 Zeilen, wie in der Tat). Aber wenn ich versuche, um die gespeicherte Prozedur auszuführen, Oracle klagt mit einem Übersetzungsfehler, wie unten dargestellt:

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

Wenn ich einen Doppelklick auf diese zweite Fehlermeldung, SQL Developer bringt mich zum ersten FROM-Klausel ( "FROM DBA_TABLES").

Also ich bin ziemlich ratlos. Ich weiß, dass SQL Server ziemlich gut, und ich bin neu in Oracle, so wenden Sie sich bitte mit mir tragen. Wenn Sie einige Hinweise geben könnte, oder mich in die richtige Richtung weisen, würde ich es wirklich schätzen.

Vielen Dank im Voraus!

War es hilfreich?

Lösung

Verwenden ALL_TABLES und All_views statt DBA_TABLES und DBA_VIEWS. ALL_% Ansichten sollten für alle Benutzer zugänglich sein.

Andere Tipps

Wenn Sie aus einer Tabelle oder einer Ansicht in einer gespeicherten PL / SQL-Prozedur oder einer gespeicherten PL / SQL-Funktion auswählen müssen Sie einen direkten Zuschuss. Ein Zuschuss über eine Datenbank-Rolle ist nicht genug.

Sie müssen wahrscheinlich einen direkten Zuschuss zu sehen dba_tables. (Public) Synonyme sind nur (public) Synonyme. Sie müssen wählen Sie Rechte direkt gewährt.

Sehen Sie hier: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:48704116042682#48798240264807

Edit: Sorry, ich über den Teil vertuscht, wo Sie scheinen zu sagen, dass Sie von DBA_TABLES direkt auswählen können. Wahrscheinlich ist das Problem ist, dass Ihre Privilegien durch eine Rolle gewährt werden, als jemand anders beantwortet. Aber es ist immer noch lohnt zu erklären, dass Ihr Verständnis von PUBLIC Synonyme unvollständig ist, und dass ALL_TABLES Verwendung wäre besser, wenn es vollbringt, was Sie brauchen.

Das Synonym sein PUBLIC bedeutet nur, dass alle Benutzer das Synonym verweisen können; es macht sie irgendwie Zugriff auf das Objekt gewähren, dass das Synonym verweist.

Was Sie am ehesten lösen diesen Fehler tun würde, ist Erteilung SELECT-Berechtigung für den SYS Blick auf den Benutzer (n), die diese Prozedur ausgeführt wird. Aber ich denke, das ist eine sehr schlechte Idee.

Wie von Raimonds vorgeschlagen, prüfen, ob Sie bekommen, was Sie von USER_TABLES oder ALL_TABLES benötigen statt. Welche Benutzer wird diese Prozedur aufrufen und welche Zugang hat, dass Benutzer SONAR5 Tische haben?

Im Allgemeinen, wenn Ihre Anwendung in einer Tabelle interessiert ist, vermutlich hat es einige Privilegien auf sich, wobei in diesem Fall sollte in ALL_TABLES aufgeführt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top